Když vytvoříte funkci s hodnotou tabulky (TVF) na serveru SQL Server, můžete z ní udělat buď funkci s hodnotou tabulky vloženou hodnotou (ITVF) nebo funkci s hodnotou tabulky s více příkazy (MSTVF). Mezi těmito typy funkcí jsou rozdíly a podle toho používají jinou syntaxi.
Tento článek popisuje rozdíl mezi MSTVF a ITVF.
Rozdíly
Zde jsou hlavní rozdíly mezi MSTVF a ITVF.
ITVF | MSTVF | |
---|---|---|
Syntaxe RETURNS | Stačí uvést RETURNS TABLE a definice návratové tabulky bude založena na SELECT funkce prohlášení. Není třeba specifikovat strukturu návratové tabulky. | Vaše RETURNS syntaxe explicitně specifikuje strukturu návratové tabulky. To se provádí deklarováním proměnné TABLE, která bude použita k uložení a akumulaci řádků, které jsou vráceny jako hodnota funkce. |
Syntaxe BEGIN/END | ITVF nepoužívají BEGIN /END syntaxe. | MSTVF používají BEGIN /END syntaxe. |
Výkon | Obecně rychlejší než MTSVF. | Obecně pomalejší než ITVF. |
Aktualizace dat | V některých případech je možné aktualizovat data v podkladových tabulkách pomocí ITFV. | Nemůžete aktualizovat data v podkladových tabulkách pomocí MSTVF. |
Syntaxe
Podívejme se na rozdíly v syntaxi jednotlivých typů funkcí.
Inline Table-Valued Function
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name ( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type [ = default ] [ READONLY ] } [ ,...n ] ] ) RETURNS TABLE [ WITH <function_option> [ ,...n ] ] [ AS ] RETURN [ ( ] select_stmt [ ) ] [ ; ]
Funkce s tabulkovou hodnotou s více příkazy
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name ( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type [ = default ] [READONLY] } [ ,...n ] ] ) RETURNS @return_variable TABLE <table_type_definition> [ WITH <function_option> [ ,...n ] ] [ AS ] BEGIN function_body RETURN END [ ; ]
Všimněte si, že MSTVF začíná definicí tabulky, ale ITVF žádnou takovou definici nemá.
MSTVF začíná RETURNS @return_variable TABLE
následuje definice tabulky. Zde @return_variable
je proměnná TABLE, která se používá k ukládání a akumulaci řádků, které by měly být vráceny jako hodnota funkce.
Příklad 1 – Inline Table-Valued Function
Zde je příklad jednoduchého ITVF.
CREATE FUNCTION 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
Zde vybírám ze dvou tabulek pomocí UNION ALL
a funkce jednoduše vrátí výsledek.
Příklad 2 – Funkce s tabulkovou hodnotou s více příkazy
Zde je příklad použití MSTVF k provedení stejné věci, ale jiným způsobem.
CREATE FUNCTION udf_PetsByName_MSTVF( @PetName varchar(70)) RETURNS @pets TABLE ( PetId varchar(20), PetName varchar(70) ) AS BEGIN INSERT INTO @pets SELECT CONCAT('Cat', ' ', CatId), CatName FROM dbo.Cats WHERE CatName = @PetName; INSERT INTO @pets SELECT CONCAT('Dog', ' ', DogId), DogName FROM dbo.Dogs WHERE DogName = @PetName; RETURN; END; GO
Funkce začíná deklarací proměnné TABLE s názvem @pets
. Přitom explicitně specifikujeme strukturu návratové tabulky.
Dotazy uvnitř BEGIN
/END
blok se uloží do proměnné TABLE s názvem @pets
.
V tomto případě jsem se rozhodl nepoužít UNION ALL
. Místo toho jsem provedl příkazy samostatně a uložil výsledky každého z nich do @pets
proměnná.
Příklad 3 – Přidání dalšího příkazu do MSTVF
Abychom dále demonstrovali „vícepříkazový“ aspekt MSTVF, můžeme do výše uvedeného MSTVF přidat další příkazy a uložit výsledky do stejné návratové proměnné.
Příklad:
CREATE FUNCTION udf_PetsByName_MSTVF( @PetName varchar(70)) RETURNS @pets TABLE ( PetId varchar(20), PetName varchar(70) ) AS BEGIN INSERT INTO @pets SELECT CONCAT('Cat', ' ', CatId), CatName FROM dbo.Cats WHERE CatName = @PetName; INSERT INTO @pets SELECT CONCAT('Dog', ' ', DogId), DogName FROM dbo.Dogs WHERE DogName = @PetName; IF @@ROWCOUNT = 0 BEGIN INSERT INTO @pets VALUES ( '', 'There are no pets of that name.' ) END RETURN; END; GO
V tomto případě jsem přidal nějaký kód, který vrátí speciální zprávu vždy, když dotaz nevrací žádné řádky.