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

Unterschied zwischen Tabellenwertfunktionen mit mehreren Anweisungen und Inline-Tabellenwertfunktionen in SQL Server

Wenn Sie eine Tabellenwertfunktion (TVF) in SQL Server erstellen, können Sie daraus entweder eine Inline-Tabellenwertfunktion (ITVF) oder eine Tabellenwertfunktion mit mehreren Anweisungen (MSTVF) machen. Es gibt Unterschiede zwischen diesen Funktionstypen und sie verwenden dementsprechend eine andere Syntax.

Dieser Artikel behandelt den Unterschied zwischen MSTVFs und ITVFs.

Die Unterschiede

Hier sind die Hauptunterschiede zwischen MSTVFs und ITVFs.

ITVF MSTVF
Die RETURNS-Syntax Sie geben einfach RETURNS TABLE an und die Definition der Rückgabetabelle basiert auf dem SELECT der Funktion Erklärung. Die Struktur der Rückgabetabelle muss nicht angegeben werden. Ihre RETURNS Syntax gibt explizit die Struktur der Rückgabetabelle an. Dazu wird eine TABLE-Variable deklariert, die zum Speichern und Akkumulieren der Zeilen verwendet wird, die als Wert der Funktion zurückgegeben werden.
Die BEGIN/END-Syntax ITVFs verwenden nicht den BEGIN /END Syntax. MSTVFs verwenden den BEGIN /END Syntax.
Leistung Im Allgemeinen schneller als MTSVFs. Allgemein langsamer als ITVFs.
Datenaktualisierungen In einigen Fällen ist es möglich, Daten in den zugrunde liegenden Tabellen mit einem ITFV zu aktualisieren. Sie können Daten in den zugrunde liegenden Tabellen nicht mit einem MSTVF aktualisieren.

Syntax

Schauen wir uns die Unterschiede in der Syntax der einzelnen Funktionstypen an.

Inline-Tabellenwertfunktion

CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name   
( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type   
    [ = default ] [ READONLY ] }   
    [ ,...n ]  
  ]  
)  
RETURNS TABLE  
    [ WITH <function_option> [ ,...n ] ]  
    [ AS ]  
    RETURN [ ( ] select_stmt [ ) ]  
[ ; ]  

Tabellenwertfunktion mit mehreren Anweisungen

CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name   
( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type   
    [ = default ] [READONLY] }   
    [ ,...n ]  
  ]  
)  
RETURNS @return_variable TABLE <table_type_definition>  
    [ WITH <function_option> [ ,...n ] ]  
    [ AS ]  
    BEGIN   
        function_body   
        RETURN  
    END  
[ ; ]

Beachten Sie, dass MSTVF mit einer Tabellendefinition beginnt, ITVF jedoch keine solche Definition hat.

Das MSTVF beginnt mit RETURNS @return_variable TABLE gefolgt von der Tabellendefinition. Hier @return_variable ist eine TABLE-Variable, die verwendet wird, um die Zeilen zu speichern und zu akkumulieren, die als Wert der Funktion zurückgegeben werden sollen.

Beispiel 1 – Inline-Tabellenwertfunktion

Hier ist ein Beispiel für ein einfaches ITVF.

CREATE FUNCTION udf_PetsByName_ITVF( @PetName varchar(70))
    RETURNS TABLE 
AS
RETURN (
    SELECT 
        CONCAT('Cat', ' ', CatId) AS PetId,
        CatName
    FROM dbo.Cats
    WHERE CatName = @PetName

    UNION ALL

    SELECT 
        CONCAT('Dog', ' ', DogId) AS PetId,
        DogName
    FROM dbo.Dogs
    WHERE DogName = @PetName
    );

GO

Hier wähle ich mit UNION ALL aus zwei Tabellen aus , und die Funktion gibt einfach das Ergebnis zurück.

Beispiel 2 – Tabellenwertfunktion mit mehreren Anweisungen

Hier ist ein Beispiel für die Verwendung eines MSTVF, um dasselbe zu tun, aber auf andere Weise.

CREATE FUNCTION 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;

    RETURN;
END;

GO

Die Funktion beginnt mit der Deklaration einer TABLE-Variable namens @pets . Dabei geben wir explizit den Aufbau der Rückgabetabelle an.

Die Abfragen innerhalb des BEGIN /END Block werden in der TABLE-Variable namens @pets gespeichert .

In diesem Fall habe ich mich entschieden, UNION ALL nicht zu verwenden . Stattdessen habe ich die Anweisungen separat ausgeführt und die Ergebnisse jeder einzelnen in @pets gespeichert Variable.

Beispiel 3 – Hinzufügen einer weiteren Anweisung zum MSTVF

Um den „Multi-Statement“-Aspekt von MSTVFs weiter zu demonstrieren, können wir dem obigen MSTVF weitere Statements hinzufügen und die Ergebnisse in derselben Rückgabevariablen speichern.

Beispiel:

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

In diesem Fall habe ich Code hinzugefügt, um eine spezielle Nachricht zurückzugeben, wenn die Abfrage dazu führt, dass keine Zeilen zurückgegeben werden.