sql >> Database teknologi >  >> RDS >> Sqlserver

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

I SQL Server, funktionen tabelværdi med flere sætninger er en af ​​to typer Transact-SQL-tabelværdierede funktioner (den anden type er den indbyggede tabelværdi-funktion).

Table-valued functions (TVF) er en type brugerdefineret funktion, der returnerer deres resultater som en tabel. De kan derfor forespørges ligesom en normal tabel.

TVF'er med flere sætninger (nogle gange omtalt som MSTVF'er) kan bestå af flere sætninger, hvis resultater er gemt i en returvariabel. Du inkluderer specifikationerne for returvariablen øverst i funktionen. Dette angiver strukturen af ​​returtabellen. Du angiver med andre ord, hvor mange kolonner, deres navne, datatyper osv.

Dette er i modsætning til inline TVF'er (også kaldet ITVF'er), som ikke bruger en returvariabel (returtabellen er defineret af SELECT udmelding).

MTVF'er bruger også BEGIN /END syntaks, hvilket er en anden ting, der adskiller dem fra ITVF'er (ITVF'er bruger ikke den syntaks).

Eksempel på en funktion med flere erklæringer med tabelværdi

Her er et eksempel på en grundlæggende 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

Her starter jeg funktionen med at definere returvariablen kaldet @pets . Det er af typen tabel , og det vil returnere to kolonner.

I dette tilfælde har jeg to SELECT sætninger og en IF udmelding. Resultaterne af hver enkelt gemmes i returvariablen. Dette gøres via en INSERT erklæring hver gang.

Funktionsmuligheder

Du kan også specificere ting som, om du vil bruge skemabinding eller ej (det burde du nok) og om du vil kryptere funktionen eller ej.

Skemabinding vil forhindre, at der foretages uønskede ændringer af de underliggende objekter, som funktionen afhænger af (såsom at droppe en tabel, ændre en kolonne osv.).

Kryptering vil konvertere funktionens definition til et sløret format (for at forhindre andre i at kunne læse det).

Se Opret en funktion med flere værdier til tabelværdi for eksempler på tilføjelse af skemabinding og kryptering til en ITVF.


  1. MIN/MAX vs ORDER BY og LIMIT

  2. Sådan uploades billeder til MySQL-databasen ved hjælp af PHP-kode

  3. Oracle-tekst undslipper med krøllede seler og jokertegn

  4. Hvordan gemmer man mappe / hierarki / træstruktur i databasen?