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

Was ist eine Tabellenwertfunktion in SQL Server?

In SQL Server eine Tabellenwertfunktion (TVF) ist eine benutzerdefinierte Funktion, die eine Tabelle zurückgibt. Dies steht im Gegensatz zu einer Skalarfunktion, die einen einzelnen Wert zurückgibt.

Sie können eine Tabellenwertfunktion auf die gleiche Weise aufrufen, wie Sie eine Tabelle abfragen können. Sie können es beispielsweise in einem SELECT verwenden Erklärung. In einigen Fällen können Tabellenwertfunktionen auch zum Aktualisieren, Löschen und Einfügen von Daten verwendet werden.

Arten von Tabellenwertfunktionen

Wenn Sie eine Tabellenwertfunktion erstellen, haben Sie die Wahl, eine Transact-SQL-Tabellenwertfunktion oder eine CLR-Tabellenwertfunktion (Common Language Runtime) zu erstellen.

Transact-SQL-Tabellenwertfunktionen

Transact-SQL-TVFs können eine der folgenden sein:

Inline-Tabellenwertfunktion (ITVF)
Wenn Sie ein ITVF erstellen, beginnen Sie die Definition der Funktion mit RETURNS TABLE , und das nachfolgende SELECT -Anweisung definiert die Struktur der Rückgabetabelle.
Tabellenwertfunktion mit mehreren Anweisungen (MSTVF)
Eine Tabellenwertfunktion mit mehreren Anweisungen kann mehrere Anweisungen enthalten, deren Ergebnisse in einer Variablen gespeichert werden, die Sie zu Beginn der Funktion deklarieren. Dabei geben Sie explizit die Struktur der Rückgabetabelle an.

CLR-Tabellenwertfunktionen

Aus der CLR-Perspektive ähnelt die Syntax der T-SQL-ITVF, unterscheidet sich jedoch geringfügig. Sie geben explizit die Struktur der Rückgabetabelle an, aber Sie deklarieren keine Rückgabevariable.

CLR-Tabellenwertfunktionen werden als Methoden für eine Klasse in einer Microsoft .NET Framework-Assembly implementiert.

Eine detailliertere Übersicht über CLR-TVFs finden Sie in der Microsoft-Dokumentation für CLR-Tabellenwertfunktionen.

Beispiel 1 – Inline-Tabellenwertfunktion

Hier ist ein Beispiel für den T-SQL-Code, der zum Erstellen einer Inline-Tabellenwertfunktion verwendet wird.

CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) )
    RETURNS TABLE
AS
RETURN (
    SELECT 
        CatId,
        CatName,
        Phone
    FROM dbo.Cats
    WHERE CatName = @CatName
    );
GO

Wir können erkennen, dass dies eine Inline-Tabellenwertfunktion ist, da sie die Struktur der Rückgabetabelle nicht angibt. Es heißt einfach RETURNS TABLE , stützt sich dann auf SELECT -Anweisung, um die Struktur der Rückgabetabelle zu bestimmen.

In diesem Fall muss der Funktion der Name der Katze als Argument übergeben werden.

Beispiele für das Hinzufügen von Optionen wie Schemabindung und Verschlüsselung finden Sie unter Erstellen einer Inline-Tabellenwertfunktion.

Die Schemabindung ist normalerweise eine gute Idee, da sie verhindert, dass nachteilige Änderungen an den zugrunde liegenden Objekten vorgenommen werden, auf die die Funktion verweist.

Beispiel 2 – Tabellenwertfunktion mit mehreren Anweisungen

So würden wir die Funktion schreiben, wenn wir wollten, dass sie eine Tabellenwertfunktion mit mehreren Anweisungen ist.

CREATE FUNCTION udf_CatsByName_MSTVF( @CatName varchar(70) )
    RETURNS @cats TABLE (
        CatId int,
        CatName varchar(70),
        Phone varchar(10)
    )
AS
BEGIN
    INSERT INTO @cats
    SELECT 
        CatId,
        CatName,
        Phone
    FROM dbo.Cats
    WHERE CatName = @CatName;

    RETURN;
END;
GO

In diesem Fall verwenden wir eine Variable vom Typ Tabelle namens @cats und wir geben explizit die Struktur der Rückgabetabelle an. Die Abfrageergebnisse werden in dieser Variablen gespeichert, die dann zurückgegeben wird, wenn die Funktion aufgerufen wird.

Dieses Beispiel wird MSTVFs nicht gerecht, da ich nur eine einzige Anweisung einfüge. Der Hauptpunkt von MSTVFs besteht darin, dass Sie mehrere Anweisungen einfügen und die Ausgabe dieser Anweisungen zur Rückgabevariablen hinzufügen können.

Ein Beispiel für die Verwendung mehrerer Anweisungen sowie Beispiele für das Hinzufügen von Optionen wie Schemabindung und Verschlüsselung finden Sie unter Erstellen einer Tabellenwertfunktion mit mehreren Anweisungen.

Beispiel 3 – Daten aus unseren Tabellenwertfunktionen auswählen

Nachdem wir nun unsere Funktionen erstellt haben, können wir sie beide mit einem SELECT aufrufen Erklärung.

SELECT * FROM udf_CatsByName_ITVF('Tom');
SELECT * FROM udf_CatsByName_MSTVF('Tom');

Ergebnis:

+---------+-----------+------------+
| CatId   | CatName   | Phone      |
|---------+-----------+------------|
| 3       | Tom       | 7871237652 |
+---------+-----------+------------+
(1 row affected)
+---------+-----------+------------+
| CatId   | CatName   | Phone      |
|---------+-----------+------------|
| 3       | Tom       | 7871237652 |
+---------+-----------+------------+
(1 row affected)

Sowohl ITVF als auch MSTVF wurden mit derselben Syntax aufgerufen und beide haben dasselbe Ergebnis zurückgegeben.

Aufrufen von Tabellenwertfunktionen

Tabellenwertfunktionen können aufgerufen werden, wenn Tabellenausdrücke im FROM erlaubt sind Klausel von SELECT , INSERT , UPDATE , oder DELETE Aussagen.

Das bedeutet, dass Sie Daten über eine Tabellenwertfunktion auswählen, einfügen, aktualisieren und sogar löschen können.

Hier sind Artikel, die jeden einzelnen demonstrieren:

  • Daten über eine Tabellenwertfunktion auswählen
  • Daten über eine Tabellenwertfunktion aktualisieren
  • Daten über eine Tabellenwertfunktion einfügen
  • Daten über eine Tabellenwertfunktion löschen