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.