Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Einführung in Tabellenwertfunktionen mit mehreren Anweisungen (MSTVF) in SQL Server

In SQL Server die Tabellenwertfunktion mit mehreren Anweisungen ist einer von zwei Typen von Transact-SQL-Tabellenwertfunktionen (der andere Typ ist die Inline-Tabellenwertfunktion).

Tabellenwertfunktionen (TVF) sind eine Art von benutzerdefinierten Funktionen, die ihre Ergebnisse als Tabelle zurückgeben. Sie können daher wie eine normale Tabelle abgefragt werden.

TVFs mit mehreren Anweisungen (manchmal auch als MSTVFs bezeichnet) können aus mehreren Anweisungen bestehen, deren Ergebnisse in einer Rückgabevariablen gespeichert werden. Sie fügen die Spezifikationen der Rückgabevariablen am Anfang der Funktion ein. Dies gibt die Struktur der Rückgabetabelle an. Mit anderen Worten, Sie geben an, wie viele Spalten, deren Namen, Datentypen usw.

Dies steht im Gegensatz zu Inline-TVFs (auch als ITVFs bezeichnet), die keine Rückgabevariable verwenden (die Rückgabetabelle wird durch SELECT definiert Erklärung).

MSTVFs verwenden auch den BEGIN /END Syntax, was eine weitere Sache ist, die sie von ITVFs unterscheidet (ITVFs verwenden diese Syntax nicht).

Beispiel einer Tabellenwertfunktion mit mehreren Anweisungen

Hier ist ein Beispiel für ein einfaches 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 starte ich die Funktion, indem ich die Rückgabevariable namens @pets definiere . Es ist vom Typ Tabelle , und es werden zwei Spalten zurückgegeben.

In diesem Fall habe ich zwei SELECT Anweisungen und ein IF Erklärung. Die Ergebnisse von jedem werden in der Rückgabevariablen gespeichert. Dies geschieht über ein INSERT Anweisung jedes Mal.

Funktionsoptionen

Sie können auch angeben, ob Schemabindung verwendet werden soll oder nicht (was Sie wahrscheinlich tun sollten) und ob die Funktion verschlüsselt werden soll oder nicht.

Die Schemabindung verhindert, dass nachteilige Änderungen an den zugrunde liegenden Objekten vorgenommen werden, von denen die Funktion abhängt (z. B. das Löschen einer Tabelle, das Ändern einer Spalte usw.).

Die Verschlüsselung konvertiert die Definition der Funktion in ein verschleiertes Format (um zu verhindern, dass andere sie lesen können).

Beispiele für das Hinzufügen von Schemabindung und Verschlüsselung zu einem ITVF finden Sie unter Erstellen einer mehrwertigen Tabellenwertfunktion.