Freigeben über


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.

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.

HinweisHinweis

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.