Benutzerdefinierte Inlinefunktionen
Benutzerdefinierte Inlinefunktionen sind benutzerdefinierte Funktionen, die einen table-Wert zurückgeben. Inlinefunktionen ermöglichen die Funktionalität parametrisierter Sichten.
Im folgenden Beispiel werden die Namen von Läden und Städten für eine angegebene Region zurückgegeben
USE AdventureWorks;
GO
CREATE VIEW CustomersByRegion
AS
SELECT DISTINCT S.Name AS Store, A.City
FROM Sales.Store AS S
JOIN Sales.CustomerAddress AS CA ON CA.CustomerID = S.CustomerID
JOIN Person.Address AS A ON A.AddressID = CA.AddressID
JOIN Person.StateProvince SP ON
SP.StateProvinceID = A.StateProvinceID
WHERE SP.Name = N'Washington';
GO
Diese Sicht würde optimiert, wenn sie allgemeiner wäre und Benutzer die Region angeben könnten, die sie anzeigen möchten. Bei Sichten sind für die Suchbedingungen der WHERE-Klausel jedoch keine Parameter möglich. Sie können deshalb benutzerdefinierte Inlinefunktionen verwenden, um in Suchbedingungen der WHERE-Klausel Parameter zuzulassen. Das folgende Beispiel erstellt eine Inlinefunktion, mit der Benutzer die Region in ihrer Abfrage angeben können:
USE AdventureWorks;
GO
IF OBJECT_ID(N'Sales.ufn_CustomerNamesInRegion', N'IF') IS NOT NULL
DROP FUNCTION Sales.ufn_CustomerNamesInRegion;
GO
CREATE FUNCTION Sales.ufn_CustomerNamesInRegion
( @Region nvarchar(50) )
RETURNS table
AS
RETURN (
SELECT DISTINCT S.Name AS Store, A.City
FROM Sales.Store AS S
JOIN Sales.CustomerAddress AS CA ON CA.CustomerID = S.CustomerID
JOIN Person.Address AS A ON A.AddressID = CA.AddressID
JOIN Person.StateProvince SP ON
SP.StateProvinceID = A.StateProvinceID
WHERE SP.Name = @Region
);
GO
-- Example of calling the function for a specific region
SELECT *
FROM Sales.ufn_CustomerNamesInRegion(N'Washington');
GO
Regeln für benutzerdefinierte Inlinefunktionen
Für benutzerdefinierte Inlinefunktionen gelten die folgenden Regeln:
- Die RETURNS-Klausel enthält nur das table-Schlüsselwort. Sie müssen das Format einer Rückgabevariablen nicht definieren, weil es durch das Format des Resultsets der SELECT-Anweisung in der RETURN-Klausel festgelegt wird.
- Es gibt keinen function_body, der durch BEGIN und END begrenzt ist.
- Die RETURN-Klausel enthält eine einzige SELECT-Anweisung in Klammern. Das Resultset der SELECT-Anweisung bildet die Tabelle, die von der Funktion zurückgegeben wird. Die SELECT-Anweisung, die in einer Inlinefunktion verwendet wird, unterliegt denselben Einschränkungen, die für SELECT-Anweisungen in Sichten gelten.
- Die Tabellenwertfunktion akzeptiert nur Konstanten oder @local_variable-Argumente.
Inlinefunktionen und indizierte Sichten
Mit Inlinefunktionen kann auch die Leistung von indizierten Sichten gesteigert werden. Die indizierte Sicht kann keine Parameter für die Suchbedingungen in der WHERE-Klausel verwenden, um das gespeicherte Resultset an bestimmte Benutzer anzupassen. Sie können jedoch eine indizierte Sicht definieren, die die vollständigen Daten für die Sicht speichert, und dann eine Inlinefunktion für die indizierte Sicht definieren, die parametrisierte Suchbedingungen enthält, mit denen die Benutzer die Ergebnisse anpassen können. Bei einer komplexen Sichtdefinition besteht der meiste Aufwand für das Erstellen eines Resultsets aus Schritten wie dem Erstellen von Aggregaten oder dem Verknüpfen mehrerer Tabellen, wenn der gruppierte Index für die Sicht erstellt wird. Wenn Sie anschließend eine Inlinefunktion erstellen, die auf die indizierte Sicht verweist, kann die Funktion mit den parametrisierten Filtern des Benutzers bestimmte Zeilen aus dem materialisierten Resultset der indizierten Sicht zurückgeben. Beispiel:
Sie definieren die
vw
_QuarterlySales
-Sicht, die alle Verkaufsdaten in einem Resultset zusammenfasst, das für alle Geschäfte eine Zusammenfassung der Verkaufsdaten nach Quartal erstellt.Sie legen eine gruppierte Sicht für
vw
_QuarterlySales
an, um ein Resultset zu erstellen, das die zusammengefassten Daten enthält.Sie erstellen eine Inlinefunktion, um die zusammengefassten Daten zu filtern:
CREATE FUNCTION dbo.ufn_QuarterlySalesByStore ( @StoreID int ) RETURNS table AS RETURN ( SELECT * FROM SalesDB.dbo.vw_QuarterlySales WHERE StoreID = @StoreID )
Benutzer können nun die Daten für ihr jeweiliges Geschäft durch Auswählen in der Inlinefunktion abrufen:
SELECT * FROM fn_QuarterlySalesByStore(14432)
Der meiste Aufwand beim Beantworten der in Schritt 4 ausgegebenen Abfragen besteht im Aggregieren der Verkaufsdaten nach Quartal. Die erforderlichen Aktionen werden einmal in Schritt 2 ausgeführt. Jede einzelne SELECT-Anweisung in Schritt 4 verwendet die fn_QuarterlySalesByStore
-Funktion, um die für das jeweilige Geschäft spezifischen aggregierten Daten zu filtern.
Siehe auch
Konzepte
Richtlinien zum Entwerfen von benutzerdefinierten Funktionen
Benutzerdefinierte Tabellenwertfunktionen
Deterministische und nicht deterministische Funktionen
Neuerstellen von gespeicherten Prozeduren als Funktionen
Erstellen von indizierten Sichten