V SQL Server, funkce vložená tabulka s hodnotou je jedním ze dvou typů funkcí s tabulkovou hodnotou Transact-SQL (druhým typem je funkce s tabulkovou hodnotou s více příkazy).
Tabulkové funkce (TVF) jsou typem uživatelem definovaných funkcí, které vracejí své výsledky jako tabulku. Lze je tedy dotazovat stejně jako normální tabulku.
Inline TVF (někdy označované jako ITVF) nemají přidružené návratové proměnné. Návratová hodnota je definována pomocí jediného SELECT
prohlášení. Tento příkaz definuje strukturu návratové tabulky. To je na rozdíl od vícepříkazových TVF (také označovaných jako MSTVF), které vyžadují návratovou proměnnou.
ITVF také nepoužívají BEGIN
/END
syntaxe, což je další věc, která je odlišuje od MSTVF.
Inline TVF jsou často považovány za ty, které mají lepší výkon než TVF s více příkazy, i když to bude také záviset na tom, co se ve funkci snažíte dělat.
Příklad vložené funkce s hodnotou tabulky
Zde je příklad základního ITVF:
CREATE FUNCTION dbo.ufn_AlbumsByArtist(@ArtistId int) RETURNS TABLE AS RETURN ( SELECT al.ArtistId, al.AlbumName, g.Genre FROM dbo.Albums al INNER JOIN dbo.Artists ar ON al.ArtistId = ar.ArtistId INNER JOIN Genres g ON al.GenreId = g.GenreId WHERE al.ArtistId = @ArtistId ); GO
V podstatě se skládá z SELECT
příkaz zabalený do nějakého jiného kódu. Aby to bylo konkrétně vložené TVF, spustil jsem funkci pomocí RETURNS TABLE
, těsně následovaný RETURN
a končící SELECT
prohlášení v závorkách.
Více příkazů
Ačkoli vložené funkce s hodnotou tabulky nejsou navrženy pro více SELECT
příkazy (k tomu slouží MSTVF), je možné použít UNION
operátor pro spojení výsledné sady více příkazů.
Příklad:
CREATE FUNCTION [dbo].[udf_PetsByName_ITVF]( @PetName varchar(70)) RETURNS TABLE AS RETURN ( SELECT CONCAT('Cat', ' ', CatId) AS PetId, CatName FROM dbo.Cats WHERE CatName = @PetName UNION ALL SELECT CONCAT('Dog', ' ', DogId) AS PetId, DogName FROM dbo.Dogs WHERE DogName = @PetName ); GO
Možnosti funkcí
Můžete také určit věci jako, zda použít nebo ne použít vazbu schématu (pravděpodobně byste měli) a zda funkci šifrovat či nikoli.
Vazba schématu zabrání jakýmkoli nepříznivým změnám v základních objektech, na kterých funkce závisí (jako je vypuštění tabulky, změna sloupce atd.).
Šifrování převede definici funkce do zamlženého formátu (aby ji ostatní nemohli číst).
Příklady přidání vazby schématu a šifrování do ITVF najdete v části Vytvoření funkce s hodnotou vložené tabulky.