V SQL Server, funkce s hodnotou tabulky (TVF) je uživatelsky definovaná funkce, která vrací tabulku. To je na rozdíl od skalární funkce, která vrací jedinou hodnotu.
Funkci s hodnotou tabulky můžete vyvolat stejným způsobem jako dotaz na tabulku. Můžete jej například použít v SELECT
prohlášení. V některých případech lze k aktualizaci, mazání a vkládání dat použít také tabulkové funkce.
Typy tabulkových funkcí
Při vytváření funkce s hodnotou tabulky máte na výběr mezi vytvořením funkce s hodnotou tabulky Transact-SQL nebo funkce s hodnotou tabulky Common Language Runtime (CLR).
Funkce s hodnotou tabulky Transact-SQL
Transact-SQL TVFs může být jeden z následujících:
- Inline Table-Valued Function (ITVF)
- Když vytvoříte ITVF, zahájíte definici funkce pomocí
RETURNS TABLE
a následujícíSELECT
příkaz definuje strukturu návratové tabulky. - Multi-Statement Table-Valued Function (MSTVF)
- Funkce s tabulkovou hodnotou s více příkazy může obsahovat více příkazů, jejichž výsledky se ukládají do proměnné, kterou deklarujete na začátku funkce. Když to uděláte, explicitně určíte strukturu návratové tabulky.
CLR Table-Valued Functions
Z pohledu CLR je syntaxe podobná T-SQL ITVF, ale mírně odlišná. Explicitně určíte strukturu návratové tabulky, ale nedeklarujete návratovou proměnnou.
Funkce CLR s hodnotou tabulky jsou implementovány jako metody na třídě v sestavení Microsoft .NET Framework.
Podrobnější přehled CLR TVF najdete v dokumentaci Microsoftu pro CLR Table-Valued Functions.
Příklad 1 – Inline Table-Valued Function
Zde je příklad kódu T-SQL použitého k vytvoření vložené funkce s hodnotou tabulky.
CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) RETURNS TABLE AS RETURN ( SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @CatName ); 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 jako argument předáno jméno kočky.
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 udf_CatsByName_MSTVF( @CatName varchar(70) ) RETURNS @cats TABLE ( CatId int, CatName varchar(70), Phone varchar(10) ) AS BEGIN INSERT INTO @cats SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @CatName; RETURN; END; GO
V tomto případě použijeme proměnnou typu table s názvem @cats
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.
Tento příklad není příliš spravedlivý pro MSTVF, protože uvádím pouze jedno prohlášení. Hlavním bodem MSTVF je, že můžete zahrnout více příkazů a můžete přidat výstup těchto příkazů do návratové proměnné.
Příklad použití více příkazů a také příklady přidávání možností, jako je vazba schématu a šifrování, najdete v části Vytvoření funkce s hodnotou tabulky s více příkazy.
Příklad 3 – Vyberte data z našich funkcí tabulkových hodnot
Takže teď, když jsme vytvořili naše funkce, můžeme je obě vyvolat pomocí SELECT
prohlášení.
SELECT * FROM udf_CatsByName_ITVF('Tom'); SELECT * FROM udf_CatsByName_MSTVF('Tom');
Výsledek:
+---------+-----------+------------+ | CatId | CatName | Phone | |---------+-----------+------------| | 3 | Tom | 7871237652 | +---------+-----------+------------+ (1 row affected) +---------+-----------+------------+ | CatId | CatName | Phone | |---------+-----------+------------| | 3 | Tom | 7871237652 | +---------+-----------+------------+ (1 row affected)
ITVF i MSTVF byly vyvolány pomocí stejné syntaxe a obě vrátily stejný výsledek.
Vyvolání funkcí s hodnotou tabulky
Tabulkové funkce lze vyvolat tam, kde jsou v FROM
povoleny tabulkové výrazy klauzule SELECT
, INSERT
, UPDATE
nebo DELETE
prohlášení.
To znamená, že můžete vybírat data, vkládat data, aktualizovat data a dokonce mazat data pomocí funkce s tabulkovou hodnotou.
Zde jsou články, které každý z nich demonstrují:
- Výběr dat pomocí funkce s hodnotou tabulky
- Aktualizujte data pomocí funkce s hodnotou tabulky
- Vkládání dat pomocí funkce s hodnotou tabulky
- Odstranění dat pomocí funkce s hodnotou tabulky