sql >> Databáze >  >> RDS >> Sqlserver

Úvod do Multi-Statement Table-Valued Functions (MSTVF) v SQL Server

V SQL Server, funkce s vícepříkazovými tabulkami je jedním ze dvou typů funkcí s hodnotou tabulky Transact-SQL (druhým typem je funkce s hodnotou inline tabulky).

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.

Vícepříkazové TVF (někdy označované jako MSTVF) se mohou skládat z více příkazů, jejichž výsledky jsou uloženy v návratové proměnné. V horní části funkce zahrnete specifikace návratové proměnné. To určuje strukturu návratové tabulky. Jinými slovy, určíte počet sloupců, jejich názvy, datové typy atd.

To je na rozdíl od inline TVF (také označovaných jako ITVF), které nepoužívají návratovou proměnnou (návratová tabulka je definována pomocí SELECT prohlášení).

MSTVF také používají BEGIN /END syntaxe, což je další věc, která je odlišuje od ITVF (ITVF tuto syntaxi nepoužívají).

Příklad funkce s tabulkovou hodnotou s více příkazy

Zde je příklad základního MSTVF:

CREATE FUNCTION dbo.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

Zde začnu funkci definováním návratové proměnné nazvané @pets . Je typu table a vrátí dva sloupce.

V tomto případě mám dva SELECT příkazy a IF prohlášení. Výsledky každého z nich jsou uloženy v návratové proměnné. To se provádí pomocí INSERT pokaždé.

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 naleznete v části Vytvoření vícehodnotové funkce s tabulkovou hodnotou.


  1. Jak na serveru SQL Server najdu všude, kde se odkazuje na sloupec?

  2. Jak deklarovat uživatelsky definovanou výjimku pomocí proměnné výjimky v databázi Oracle

  3. Chyba serveru SQL 110:V příkazu INSERT je méně sloupců než hodnot zadaných v klauzuli VALUES.

  4. Odhad mohutnosti:Kombinace statistik hustoty