Sie können eine Tabellenwertfunktion (TVF) in SQL Server mithilfe von CREATE FUNCTION
erstellen T-SQL-Syntax.
Die Syntax unterscheidet sich geringfügig, je nachdem, ob Sie eine Inline-Tabellenwertfunktion (ITVF) oder eine Multi-Statement-Tabellenwertfunktion (MSTVF) erstellen.
Beispiel 1 – Inline-Tabellenwertfunktion
Hier ist ein Beispiel für eine Inline-Tabellenwertfunktion.
CREATE FUNCTION dbo.ufn_AlbumsByGenre_ITVF(@GenreId int) RETURNS TABLE AS RETURN( SELECT ar.ArtistName, al.AlbumName, g.Genre FROM Genres g INNER JOIN Albums al ON g.GenreId = al.GenreId INNER JOIN Artists ar ON al.ArtistId = ar.ArtistId WHERE g.GenreId = @GenreId ); 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 die Genre-ID 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 dbo.ufn_AlbumsByGenre_MSTVF(@GenreId int) RETURNS @Albums TABLE ( ArtistName nvarchar(255), AlbumName nvarchar(255), Genre nvarchar(50) ) AS BEGIN INSERT INTO @Albums SELECT ar.ArtistName, al.AlbumName, g.Genre FROM Genres g INNER JOIN Albums al ON g.GenreId = al.GenreId INNER JOIN Artists ar ON al.ArtistId = ar.ArtistId WHERE g.GenreId = @GenreId RETURN END GO
In diesem Fall verwenden wir eine Variable vom Typ Tabelle mit dem Namen @Albums
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.
Einer der Vorteile von MSTVFs besteht darin, dass sie mehrere Anweisungen enthalten können. Hier ist es noch einmal mit einem zusätzlichen Teil am Ende.
CREATE FUNCTION dbo.ufn_AlbumsByGenre_MSTVF(@GenreId int) RETURNS @Albums TABLE ( ArtistName nvarchar(255), AlbumName nvarchar(255), Genre nvarchar(50) ) AS BEGIN INSERT INTO @Albums SELECT ar.ArtistName, al.AlbumName, g.Genre FROM Genres g INNER JOIN Albums al ON g.GenreId = al.GenreId INNER JOIN Artists ar ON al.ArtistId = ar.ArtistId WHERE g.GenreId = @GenreId IF @@ROWCOUNT = 0 BEGIN INSERT INTO @Albums VALUES ( 'None', 'None', 'None' ) END RETURN END GO
Beispiele für das Hinzufügen von Optionen wie Schemabindung und Verschlüsselung finden Sie unter Erstellen einer Tabellenwertfunktion mit mehreren Anweisungen.