Можете да създадете функция с таблична стойност (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
Вижте Създаване на функция с таблично стойности с множество изрази за примери за добавяне на опции като свързване на схема и криптиране.