sql >> Database >  >> RDS >> Sqlserver

Inleiding tot Multi-Statement Table-Valued Functions (MSTVF) in SQL Server

In SQL Server is de functie met tabelwaarde met meerdere instructies is een van de twee typen Transact-SQL-tabelwaardefuncties (het andere type is de inline tabelwaardefunctie).

Tabelwaardefuncties (TVF) zijn een type door de gebruiker gedefinieerde functie waarvan de resultaten als een tabel worden geretourneerd. Ze kunnen dus net als een normale tabel worden opgevraagd.

Multi-statement TVF's (soms MSTVF's genoemd) kunnen bestaan ​​uit meerdere instructies, waarvan de resultaten worden opgeslagen in een return-variabele. Bovenaan de functie zet je de specificaties van de return-variabele. Dit specificeert de structuur van de retourtabel. Met andere woorden, u specificeert hoeveel kolommen, hun namen, gegevenstypes, enz.

Dit in tegenstelling tot inline TVF's (ook wel ITVF's genoemd), die geen retourvariabele gebruiken (de retourtabel wordt gedefinieerd door de SELECT uitspraak).

MSTVF's gebruiken ook de BEGIN /END syntaxis, iets anders dat hen onderscheidt van ITVF's (ITVF's gebruiken die syntaxis niet).

Voorbeeld van een multi-statement tabelwaardefunctie

Hier is een voorbeeld van een basis-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

Hier start ik de functie door de retourvariabele te definiëren met de naam @pets . Het is van het type tabel , en het geeft twee kolommen terug.

In dit geval heb ik twee SELECT statements en een IF uitspraak. De resultaten van elk worden opgeslagen in de return-variabele. Dit gebeurt via een INSERT elke keer een verklaring.

Functie-opties

Je kunt ook dingen specificeren zoals of je wel of niet schemabinding wilt gebruiken (waarschijnlijk zou je dat moeten doen) en of de functie wel of niet moet worden versleuteld.

Schemabinding voorkomt dat er nadelige wijzigingen worden aangebracht in de onderliggende objecten waarvan de functie afhankelijk is (zoals het laten vallen van een tabel, het wijzigen van een kolom, enz.).

Versleuteling converteert de definitie van de functie naar een versluierd formaat (om te voorkomen dat anderen het kunnen lezen).

Zie Create a Multi-Valued Table-Valued Function voor voorbeelden van het toevoegen van schemabinding en encryptie aan een ITVF.


  1. JSON_VALUE() in MySQL

  2. SINH() Functie in Oracle

  3. Hoe gebruik je de %-operator van de extensie pg_trgm?

  4. Panda's update sql