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

Einführung in Inline-Tabellenwertfunktionen (ITVF) in SQL Server

In SQL Server die inline-Tabellenwertfunktion ist einer von zwei Typen von Transact-SQL-Tabellenwertfunktionen (der andere Typ ist die Tabellenwertfunktion mit mehreren Anweisungen).

Tabellenwertfunktionen (TVF) sind eine Art von benutzerdefinierten Funktionen, die ihre Ergebnisse als Tabelle zurückgeben. Sie können daher wie eine normale Tabelle abgefragt werden.

Inline-TVFs (manchmal auch als ITVFs bezeichnet) haben keine zugeordneten Rückgabevariablen. Der Rückgabewert wird durch ein einzelnes SELECT definiert Erklärung. Diese Anweisung definiert die Struktur der Rückgabetabelle. Dies steht im Gegensatz zu TVFs mit mehreren Anweisungen (auch als MSTVFs bezeichnet), die eine Rückgabevariable erfordern.

ITVFs verwenden auch nicht den BEGIN /END Syntax, was ein weiterer Unterschied zu MSTVFs ist.

Inline-TVFs werden oft als leistungsstärker angesehen als TVFs mit mehreren Anweisungen, obwohl dies auch davon abhängt, was Sie in der Funktion tun möchten.

Beispiel einer Inline-Tabellenwertfunktion

Hier ist ein Beispiel für ein einfaches ITVF:

CREATE FUNCTION dbo.ufn_AlbumsByArtist(@ArtistId int)
RETURNS TABLE
AS
RETURN (  
    SELECT 
      al.ArtistId,
      al.AlbumName,
      g.Genre
    FROM dbo.Albums al 
      INNER JOIN dbo.Artists ar 
        ON al.ArtistId = ar.ArtistId
      INNER JOIN Genres g
        ON al.GenreId = g.GenreId
    WHERE al.ArtistId = @ArtistId
);

GO

Es besteht im Wesentlichen aus einem SELECT Anweisung, die in anderen Code eingeschlossen ist. Um es speziell zu einem inline zu machen TVF, ich habe die Funktion mit RETURNS TABLE gestartet , dicht gefolgt von RETURN , und endet mit einem SELECT Anweisung in Klammern.

Mehrere Anweisungen

Obwohl Inline-Tabellenwertfunktionen nicht für mehrere SELECT ausgelegt sind -Anweisungen (dafür sind MSTVFs da), ist es möglich, die UNION zu verwenden Operator, um die Ergebnismenge mehrerer Anweisungen zu kombinieren.

Beispiel:

CREATE FUNCTION [dbo].[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

Funktionsoptionen

Sie können auch angeben, ob Schemabindung verwendet werden soll oder nicht (was Sie wahrscheinlich tun sollten) und ob die Funktion verschlüsselt werden soll oder nicht.

Die Schemabindung verhindert, dass nachteilige Änderungen an den zugrunde liegenden Objekten vorgenommen werden, von denen die Funktion abhängt (z. B. das Löschen einer Tabelle, das Ändern einer Spalte usw.).

Die Verschlüsselung konvertiert die Definition der Funktion in ein verschleiertes Format (um zu verhindern, dass andere sie lesen können).

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