Na serveru SQL Server můžete vytvořit funkci s hodnotou tabulky (TVF) pomocí CREATE FUNCTION Syntaxe T-SQL.
Syntaxe se mírně liší v závislosti na tom, zda vytváříte inline tabulkovou funkci (ITVF) nebo vícepříkazovou tabulkovou funkci (MSTVF).
Příklad 1 – Inline Table-Valued Function
Zde je příklad funkce vložené tabulky s hodnotou.
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
Můžeme říci, že se jedná o inline funkci s hodnotou tabulky, protože neurčuje strukturu návratové tabulky. Jednoduše uvádí RETURNS TABLE , pak se spoléhá na SELECT k určení struktury návratové tabulky.
V tomto případě funkce vyžaduje, aby bylo ID žánru předáno jako argument.
Příklady přidání možností, jako je vazba schématu a šifrování, najdete v části Vytvoření funkce s hodnotou vložené tabulky.
Vazba schématu je obvykle dobrý nápad, protože zabrání jakýmkoli nepříznivým změnám v podkladových objektech, na které funkce odkazuje.
Příklad 2 – Funkce s tabulkovou hodnotou s více příkazy
Zde je návod, jak bychom funkci napsali, pokud bychom chtěli, aby to byla vícepříkazová funkce s tabulkovou hodnotou.
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
V tomto případě použijeme proměnnou typu table s názvem @Albums a explicitně specifikujeme strukturu návratové tabulky. Výsledky dotazu jsou uloženy v této proměnné, která je poté vrácena při vyvolání funkce.
Jednou z výhod MSTVF je, že mohou obsahovat více příkazů. Tady je to znovu s extra částí přidanou na konec.
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
Příklady přidávání voleb, jako je vazba schématu a šifrování, najdete v části Vytvoření funkce s tabulkovou hodnotou s více příkazy.