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

Erstellen Sie eine Tabellenwertfunktion in SQL Server

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.