Ausführen benutzerdefinierter Funktionen (Datenbankmodul)
Benutzerdefinierte Funktionen können in Abfragen bzw. in anderen Anweisungen oder Ausdrücken wie berechneten Spalten oder Zeichenfolgenausdrücken aufgerufen werden. Skalarwertfunktionen können über die EXECUTE-Anweisung ausgeführt werden.
Aufrufen benutzerdefinierter Funktionen, die einen Skalarwert zurückgeben
Sie können benutzerdefinierte Funktionen, die Skalarwerte zurückgeben, überall dort aufrufen, wo Skalarausdrücke desselben Datentyps in Transact-SQL-Anweisungen zulässig sind. Skalarwertfunktionen müssen mindestens mithilfe des zweiteiligen Namens der Funktion aufgerufen werden. Weitere Informationen zu mehrteiligen Namen finden Sie unter Transact-SQL-Syntaxkonventionen (Transact-SQL).
Abfragen
Benutzerdefinierte Funktionen, die skalare Werte zurückgeben, sind an folgenden Stellen zugelassen:
Als expression in der select_list einer SELECT-Anweisung:
USE AdventureWorks2008R2; GO SELECT ProductID, ListPrice, dbo.ufnGetProductDealerPrice(ProductID, StartDate) AS DealerPrice, StartDate, EndDate FROM Production.ProductListPriceHistory WHERE ListPrice > .0000 ORDER BY ProductID, StartDate; GO
Als expression oder string_expression in einem Prädikat einer WHERE- oder HAVING-Klausel:
USE AdventureWorks2008R2; GO SELECT ProductID, ListPrice, StartDate, EndDate FROM Production.ProductListPriceHistory WHERE dbo.ufnGetProductDealerPrice(ProductID, StartDate) > .0000 ORDER BY ProductID, StartDate; GO
Als group_by_expression in einer GROUP BY-Klausel.
Als order_by_expression in einer ORDER BY-Klausel.
Als expression in der SET-Klausel einer UPDATE-Anweisung:
USE AdventureWorks2008R2; GO UPDATE Production.ProductListPriceHistory SET ListPrice = dbo.ufnGetProductDealerPrice(ProductID, StartDate) WHERE ProductID > 900; GO
Als expression in der VALUES-Klausel einer INSERT-Anweisung:
Benutzerdefinierte Funktionen, auf die an diesen Positionen verwiesen wird, werden einmal pro Zeile logisch ausgeführt.
CHECK-Einschränkungen
Benutzerdefinierte Funktionen, die skalare Werte zurückgeben, können in CHECK-Einschränkungen aufgerufen werden, wenn die an die Funktion übergebenen Argumentwerte nur auf Spalten in der Tabelle oder Konstanten verweisen. Wenn der Abfrageprozessor die Einschränkung überprüft, ruft er die Funktion mit den Argumentwerten auf, die der derzeit überprüften Zeile zugeordnet sind. Der Besitzer einer Tabelle muss zugleich Besitzer der von einer CHECK-Einschränkung in der Tabelle aufgerufenen benutzerdefinierten Funktion sein.
DEFAULT-Definitionen
Benutzerdefinierte Funktionen können als constant_expression von DEFAULT-Definitionen aufgerufen werden, wenn die an die Funktion übergebenen Argumentwerte nur Konstanten enthalten. Der Besitzer der Tabelle muss zugleich Besitzer der von einer DEFAULT-Definition in der Tabelle aufgerufenen benutzerdefinierten Funktion sein.
Berechnete Spalten
Funktionen können von berechneten Spalten aufgerufen werden, wenn die an die Funktion übergebenen Argumentwerte nur auf Spalten in der Tabelle oder Konstanten verweisen. Der Besitzer der Tabelle muss zugleich Besitzer der von einer berechneten Spalte in der Tabelle aufgerufenen benutzerdefinierten Funktion sein.
Zuweisungsoperatoren
Zuweisungsoperatoren (left_operand = right_operand) können benutzerdefinierte Funktionen aufrufen, die einen skalaren Wert in dem als rechter Operand angegebenen Ausdruck zurückgeben.
Anweisungen zur Ablaufsteuerung
Benutzerdefinierte Funktionen, die skalare Werte zurückgeben, können von Anweisungen zur Ablaufsteuerung in deren booleschen Ausdrücken aufgerufen werden.
CASE-Ausdrücke
Benutzerdefinierte Funktionen, die einen skalaren Wert zurückgeben, können in einem beliebigen CASE-Ausdruck aufgerufen werden.
PRINT-Anweisungen
Benutzerdefinierte Funktionen, die eine Zeichenfolge zurückgeben, können als string_expr-Ausdruck von PRINT-Anweisungen aufgerufen werden.
Funktionen und gespeicherte Prozeduren
Funktionsargumente können auch ein Verweis auf eine benutzerdefinierte Funktion sein, die einen skalaren Wert zurückgibt.
RETURN integer_expression-Anweisungen in gespeicherten Prozeduren können benutzerdefinierte Funktionen aufrufen, die als integer_expression eine ganze Zahl zurückgeben.
RETURN return_type_spec-Anweisungen in benutzerdefinierten Funktionen können benutzerdefinierte Funktionen aufrufen, die einen skalaren Datentyp zurückgeben, wie z. B. return_type_spec, sofern der von der aufgerufenen benutzerdefinierten Funktion zurückgegebene Wert implizit in den Rückgabedatentyp der aufrufenden Funktion konvertiert werden kann.
Ausführen benutzerdefinierter Funktionen, die einen Skalarwert zurückgeben
Sie können benutzerdefinierte Funktionen, die Skalarwerte zurückgeben, auf dieselbe Art ausführen wie gespeicherte Prozeduren. Beim Ausführen einer benutzerdefinierten Funktion, die einen skalaren Wert zurückgibt, werden die Parameter in derselben Art angegeben, wie für gespeicherte Prozeduren:
Die Argumentwerte werden nicht in Klammern gesetzt.
Parameternamen können angegeben werden.
Falls Parameternamen angegeben werden, müssen die Argumentwerte nicht in der gleichen Reihenfolge stehen wie die Parameter.
Im folgenden Beispiel wird eine benutzerdefinierte Funktion erstellt, die einen dezimalen skalaren Wert zurückgibt.
IF OBJECT_ID(N'dbo.ufn_CubicVolume', N'FN') IS NOT NULL
DROP FUNCTION dbo.ufn_CubicVolume;
GO
CREATE FUNCTION dbo.ufn_CubicVolume
-- Input dimensions in centimeters.
(@CubeLength decimal(4,1), @CubeWidth decimal(4,1),
@CubeHeight decimal(4,1) )
RETURNS decimal(12,3) -- Cubic Centimeters.
WITH SCHEMABINDING
AS
BEGIN
RETURN ( @CubeLength * @CubeWidth * @CubeHeight )
END;
GO
Im folgenden Beispiel wird die dbo.ufn_CubicVolume-Funktion ausgeführt. Mithilfe der Transact-SQL-EXECUTE-Anweisung werden die Argumente in einer anderen Reihenfolge als die Parameter in der Definition der Funktion identifiziert:
DECLARE @MyDecimalVar decimal(12,3);
EXEC @MyDecimalVar = dbo.ufn_CubicVolume @CubeLength = 12.3,
@CubeHeight = 4.5, @CubeWidth = 4.5;
SELECT @MyDecimalVar;
GO
Im folgenden Beispiel wird die dbo.ufn_CubicVolume-Funktion ohne Angabe der Parameternamen ausgeführt:
DECLARE @MyDecimalVar decimal(12,3);
EXEC @MyDecimalVar = dbo.ufn_CubicVolume 12.3, 4.5, 4.5;
SELECT @MyDecimalVar;
GO
Sie können auch die ODBC CALL-Syntax zum Ausführen der dbo.ufn_CubicVolume-Funktion aus OLE DB- oder ODBC-Anwendungen heraus verwenden:
-- First use SQLBindParam to bind the return value parameter marker
-- to a program variable of the appropriate type
SQLExecDirect(hstmt,
"{ CALL ? = dbo.ufn_CubicVolume(12.3, 4.5, 4.5) }",
SQL_NTS);
Aufrufen benutzerdefinierter Funktionen, die einen table-Datentyp zurückgeben
Sie können benutzerdefinierte Funktionen aufrufen, die einen table-Wert zurückgeben, wenn Tabellenausdrücke in der FROM-Klausel von SELECT-, INSERT-, UPDATE- oder DELETE-Anweisungen zugelassen sind. Dem Aufruf einer benutzerdefinierten Funktion, die eine Tabelle zurückgibt, kann ein optionaler Tabellenalias folgen. Im folgenden Beispiel wird gezeigt, wie die dbo.ufnGetContactInformation-Tabellenwertfunktion in der FROM-Klausel einer SELECT-Anweisung aufgerufen wird.
USE AdventureWorks2008R2;
GO
SELECT ContactID, FirstName, LastName, JobTitle, ContactType
FROM dbo.ufnGetContactInformation(1209);
GO
SELECT ContactID, FirstName, LastName, JobTitle, ContactType
FROM dbo.ufnGetContactInformation(5);
GO
Wenn eine benutzerdefinierte Funktion, die eine Tabelle zurückgibt, in der FROM-Klausel einer Unterabfrage aufgerufen wird, können die Funktionsargumente nicht auf Spalten in der äußeren Abfrage verweisen.
Statische, schreibgeschützte Cursor sind die einzigen Cursortypen, die in einer SELECT-Anweisung geöffnet werden können, deren FROM-Klausel auf eine benutzerdefinierte Funktion verweist, die eine Tabelle zurückgibt.
Eine SELECT-Anweisung, die auf eine benutzerdefinierte Funktion verweist, welche einen table-Wert zurückgibt, ruft die Funktion einmal auf.
Aufrufen integrierter Tabellenwertfunktionen
Es stehen mehrere integrierte Tabellenwertfunktionen bereit, die einen Tabellenwert zurückgeben. Diese integrierten, benutzerdefinierten Funktionen können "unqualifiziert" aufgerufen werden. Sie können dazu aber auch den sys-Schemaqualifizierer verwenden. Es wird empfohlen, den sys-Schemaqualifizierer bei integrierten Tabellenwertfunktionen zu verwenden, da er Konflikte mit benutzerdefinierten Funktionen mit denselben Namen verhindert. Das folgende Beispiel zeigt, wie Sie die integrierte Systemfunktion fn_helpcollations aufrufen können.
SELECT *
FROM sys.fn_helpcollations();
GO
Verwenden von Hinweisen mit Tabellenwertfunktionen
Beim Erstellen benutzerdefinierter Funktionen können Sie auf beliebige Abfragen, die die Funktionsdefinition bilden, Tabellenhinweise anwenden. Hinweise, die auf Sichten angewendet werden, welche wiederum auf Transact-SQL-Tabellenwertfunktionen verweisen, werden auch auf diese Funktionen angewendet. Die Funktionen können mit den Hinweisen in der Funktionsdefinition in Konflikt stehen. Weitere Informationen finden Sie unter Sichtauflösung.
Auf Sichten, die auf CLR-Tabellenwertfunktionen verweisen, können Sie keinen Hinweise anwenden.
Hinweis |
---|
Die Funktionalität des Database Engine (Datenbankmodul), Hinweise in Sichten auf Tabellenwertfunktionen mit mehreren Anweisungen anzuwenden, in denen die Tabellenwertfunktionen Teil der Sicht sind, wird in zukünftigen Versionen von SQL Server entfernt. |
Auf das Ergebnis von Tabellenwertfunktionen können Sie keinen Tabellenhinweis in der FROM-Klausel einer Abfrage anwenden.