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.