sql >> Databasteknik >  >> RDS >> Sqlserver

Introduktion till Multi-Statement Table-Valued Functions (MSTVF) i SQL Server

I SQL Server, funktionen tabellvärde med flera påståenden är en av två typer av Transact-SQL-tabellvärderade funktioner (den andra typen är den inline-tabellvärderade funktionen).

Table-valued functions (TVF) är en typ av användardefinierad funktion som returnerar sina resultat som en tabell. De kan därför frågas precis som en vanlig tabell.

TVF:er med flera påståenden (ibland kallade MSTVFs) kan bestå av flera satser, vars resultat lagras i en returvariabel. Du inkluderar specifikationerna för returvariabeln överst i funktionen. Detta anger strukturen för returtabellen. Du anger med andra ord hur många kolumner, deras namn, datatyper etc.

Detta till skillnad från inline TVF:er (även kallade ITVFs), som inte använder en returvariabel (returtabellen definieras av SELECT) påstående).

MTVFs använder också BEGIN /END syntax, vilket är en annan sak som skiljer dem från ITVF:er (ITVF:er använder inte den syntaxen).

Exempel på en funktion med flera uttalanden i tabellvärden

Här är ett exempel på en grundläggande MTVF:

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

Här startar jag funktionen genom att definiera returvariabeln som heter @pets . Det är av typen tabell , och det kommer att returnera två kolumner.

I det här fallet har jag två SELECT satser och en IF påstående. Resultaten av var och en lagras i returvariabeln. Detta görs via en INSERT uttalande varje gång.

Funktionsalternativ

Du kan också specificera saker som om du ska använda schemabindning eller inte (det borde du förmodligen) och om du ska kryptera funktionen eller inte.

Schemabindning kommer att förhindra att några negativa ändringar görs av de underliggande objekten som funktionen beror på (som att ta bort en tabell, ändra en kolumn, etc).

Kryptering kommer att konvertera funktionens definition till ett obfuskerat format (för att förhindra att andra kan läsa den).

Se Skapa en funktion med flera värden för tabeller för exempel på hur man lägger till schemabindning och kryptering till en ITVF.


  1. SQL Server och Spectre/Meltdown Vulnerabilities

  2. Databas hög tillgänglighet för Camunda BPM med MySQL eller MariaDB Galera Cluster

  3. Formatera siffror genom att fylla med inledande nollor i SQL Server

  4. Ändra hur isql kör SQL