Можете да създадете функция с таблична стойност (TVF) в SQL Server, като използвате CREATE FUNCTION
Синтаксис на T-SQL.
Синтаксисът е малко по-различен в зависимост от това дали създавате вградена функция с таблична стойност (ITVF) или функция с стойност на таблица с множество изрази (MSTVF).
Пример 1 – Вградена функция с таблично стойност
Ето пример за вградена функция със стойност на таблица.
CREATE FUNCTION dbo.ufn_AlbumsByGenre_ITVF(@GenreId int) RETURNS TABLE AS RETURN( SELECT ar.ArtistName, al.AlbumName, g.Genre FROM Genres g INNER JOIN Albums al ON g.GenreId = al.GenreId INNER JOIN Artists ar ON al.ArtistId = ar.ArtistId WHERE g.GenreId = @GenreId ); GO
Можем да кажем, че това е вградена функция със стойност на таблица, тъй като не посочва структурата на таблицата за връщане. Той просто посочва RETURNS TABLE
, след което разчита на SELECT
оператор за определяне на структурата на таблицата за връщане.
В този случай функцията изисква идентификаторът на жанра да бъде подаден като аргумент.
Вижте Създаване на вградена функция с стойност на таблица за примери за добавяне на опции като свързване на схема и криптиране.
Обвързването на схемата обикновено е добра идея, тъй като ще предотврати извършването на всякакви неблагоприятни промени в основните обекти, които функцията препраща.
Пример 2 – Функция с таблична стойност с множество изрази
Ето как бихме написали функцията, ако искаме тя да бъде функция с таблична стойност с множество изрази.
CREATE FUNCTION dbo.ufn_AlbumsByGenre_MSTVF(@GenreId int) RETURNS @Albums TABLE ( ArtistName nvarchar(255), AlbumName nvarchar(255), Genre nvarchar(50) ) AS BEGIN INSERT INTO @Albums SELECT ar.ArtistName, al.AlbumName, g.Genre FROM Genres g INNER JOIN Albums al ON g.GenreId = al.GenreId INNER JOIN Artists ar ON al.ArtistId = ar.ArtistId WHERE g.GenreId = @GenreId RETURN END GO
В този случай използваме променлива от тип таблица наречен @Albums
и ние изрично указваме структурата на таблицата за връщане. Резултатите от заявката се съхраняват в тази променлива, която след това се връща при извикване на функцията.
Едно от предимствата на MSTVF е, че те могат да съдържат множество изявления. Ето го отново с добавена допълнителна част в края.
CREATE FUNCTION dbo.ufn_AlbumsByGenre_MSTVF(@GenreId int) RETURNS @Albums TABLE ( ArtistName nvarchar(255), AlbumName nvarchar(255), Genre nvarchar(50) ) AS BEGIN INSERT INTO @Albums SELECT ar.ArtistName, al.AlbumName, g.Genre FROM Genres g INNER JOIN Albums al ON g.GenreId = al.GenreId INNER JOIN Artists ar ON al.ArtistId = ar.ArtistId WHERE g.GenreId = @GenreId IF @@ROWCOUNT = 0 BEGIN INSERT INTO @Albums VALUES ( 'None', 'None', 'None' ) END RETURN END GO
Вижте Създаване на функция с таблично стойности с множество изрази за примери за добавяне на опции като свързване на схема и криптиране.