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.