SELECT
изразът е може би най-често използваният израз в SQL Server. През повечето време това изявление се изпълнява срещу изглед или директно срещу таблица за извличане на редове с таблични данни.
Но изгледите и таблиците не са единствените обекти, които можете да стартирате с SELECT
изявление върху. SELECT
операторът може да се използва и за други обекти, като функции за набор от редове, OPENXML и дефинирани от потребителя функции.
Тази статия предоставя пример за избор на данни чрез функция с таблично значение.
Пример 1 – Основна функция
Ето една бърза функция, която избира основни данни от таблица чрез вградена функция със стойност на таблица.
SELECT * FROM udf_Cats_ITVF();
Резултат:
+---------+-----------+------------+ | CatId | CatName | Phone | |---------+-----------+------------| | 1 | Garfield | 9871237654 | | 2 | Felix | 8871237651 | | 3 | Tom | 7871237652 | | 4 | Fetch | 6871237653 | +---------+-----------+------------+
Функцията изглежда така:
CREATE FUNCTION dbo.udf_Cats_ITVF() RETURNS TABLE AS RETURN ( SELECT CatId, CatName, Phone FROM dbo.Cats ); GO
Тази функция просто избира всички редове от таблица. Не се изискват аргументи.
Ако искате да изберете определена котка, трябва да добавите WHERE
клауза.
SELECT * FROM udf_Cats_ITVF() WHERE CatName = 'Fetch';
Резултат:
+---------+-----------+------------+ | CatId | CatName | Phone | |---------+-----------+------------| | 4 | Fetch | 6871237653 | +---------+-----------+------------+
Сега трябва да призная, че тази функция е някак излишна, защото можехме просто да изберем данните директно от таблицата. Или можехме да създадем изглед, за да свършим работата. Но дефинираните от потребителя функции имат предимство, че таблиците и изгледите нямат:параметри.
Пример 2 – Функция с параметри
Едно от предимствата на функциите с таблично значение е, че поддържат параметри. Тук функцията става малко по-полезна. Някои наричат функциите със стойност на таблицата „параметризирани изгледи“, тъй като те се държат точно като изглед, но с добавената функционалност за разрешаване на параметри.
Така че бихме могли да създадем вариант на предишната функция, за да приемем аргумент за името на котката.
SELECT * FROM udf_CatsByName_ITVF('Fetch');
Резултат:
+---------+-----------+------------+ | CatId | CatName | Phone | |---------+-----------+------------| | 4 | Fetch | 6871237653 | +---------+-----------+------------+
Новата функция изглежда така:
CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) RETURNS TABLE AS RETURN ( SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @CatName ); GO
Пример 3 – Присъединяване
Функциите с таблично значение могат да бъдат включени в съединения.
Тук избирам всички колони от функция с таблица, която връща всички албуми от даден изпълнител:
SELECT * FROM ufn_AlbumsByArtist(1);
Резултат:
+------------+-------------------------+---------+ | ArtistId | AlbumName | Genre | |------------+-------------------------+---------| | 1 | Powerslave | Rock | | 1 | Somewhere in Time | Rock | | 1 | Piece of Mind | Rock | | 1 | Killers | Rock | | 1 | No Prayer for the Dying | Rock | +------------+-------------------------+---------+
Единственият проблем с тази функция е, че не връща името на изпълнителя. Ако искам името на изпълнителя, трябва да го присъединя към таблицата, която съдържа тези данни. В този случай таблицата, която съдържа името на изпълнителя, се нарича Artists
, така че мога да променя заявката си, както следва:
SELECT ar.ArtistName, aba.AlbumName, aba.Genre FROM ufn_AlbumsByArtist(1) aba INNER JOIN Artists ar ON aba.ArtistId = ar.ArtistId;
Резултат:
+--------------+-------------------------+---------+ | ArtistName | AlbumName | Genre | |--------------+-------------------------+---------| | Iron Maiden | Powerslave | Rock | | Iron Maiden | Somewhere in Time | Rock | | Iron Maiden | Piece of Mind | Rock | | Iron Maiden | Killers | Rock | | Iron Maiden | No Prayer for the Dying | Rock | +--------------+-------------------------+---------+