Teilen über


Benutzerdefinierte Skalarfunktionen für In-Memory-OLTP

Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance

In SQL Server 2016 (13.x) können Sie nativ kompilierte benutzerdefinierte Skalarfunktionen erstellen und löschen. Sie können auch die folgenden benutzerdefinierten Funktionen ändern. Durch native Kompilierung wird die Leistung der Auswertung benutzerdefinierter Funktionen in Transact-SQL verbessert.

Wenn Sie eine nativ kompilierte benutzerdefinierte Skalarfunktion ändern, bleibt die Anwendung verfügbar, während der Vorgang ausgeführt und die neue Version der Funktion kompiliert wird.

Informationen zu unterstützten T-SQL-Konstrukten finden Sie unter Unterstützte Funktionen für nativ kompilierte T-SQL-Module.

Erstellen, Löschen und Ändern von benutzerdefinierten Funktionen

CREATE FUNCTION wird zum Erstellen der nativ kompilierten benutzerdefinierten Skalarfunktion, DROP FUNCTION zum Entfernen der benutzerdefinierten Funktion und ALTER FUNCTION zum Ändern der Funktion verwendet. BEGIN ATOMIC WITH wird für die benutzerdefinierten Funktionen benötigt.

Informationen zur unterstützten Syntax und zu Einschränkungen finden Sie in den folgenden Themen.

Die gespeicherte Prozedur sp_recompile (Transact-SQL) kann mit der nativ kompilierten benutzerdefinierten Skalarfunktion verwendet werden. Dies führt dazu, dass die Funktion mithilfe der in den Metadaten vorhandenen Definition erneut kompiliert wird.

Das folgende Beispiel zeigt eine skalare benutzerdefinierte Funktion aus der Beispieldatenbank AdventureWorks2022.

CREATE FUNCTION [dbo].[ufnLeadingZeros_native](@Value int)   
RETURNS varchar(8)   
WITH NATIVE_COMPILATION, SCHEMABINDING  
AS   
BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'English')  
  
    DECLARE @ReturnValue varchar(8);  
    SET @ReturnValue = CONVERT(varchar(8), @Value);  
       DECLARE @i int = 0, @count int = 8 - LEN(@ReturnValue)  
  
    WHILE @i < @count  
       BEGIN  
            SET @ReturnValue = '0' + @ReturnValue;  
            SET @i += 1  
       END  
  
    RETURN (@ReturnValue);  
  
END  

Aufrufen benutzerdefinierter Funktionen

Nativ kompilierte benutzerdefinierte Skalarfunktionen können in Ausdrücken und am gleichen Ort wie integrierte Skalarfunktionen und interpretierte benutzerdefinierte Skalarfunktionen verwendet werden. Nativ kompilierte benutzerdefinierte Skalarfunktionen können auch mit der EXECUTE-Anweisung, in einer Transact-SQL-Anweisung und in einer nativ kompilierten gespeicherten Prozedur verwendet werden.

Sie können diese benutzerdefinierten Skalarfunktionen in nativ kompilierten gespeicherten Prozeduren, in nativ kompilierten benutzerdefinierten Funktionen und überall dort verwenden, wo integrierte Funktionen zulässig sind. Sie können nativ kompilierte benutzerdefinierte Skalarfunktionen auch in herkömmlichen Transact-SQL-Modulen verwenden.

Sie können diese benutzerdefinierten Skalarfunktionen im Interop-Modus überall dort verwenden, wo eine interpretierte benutzerdefinierte Skalarfunktion verwendet werden kann. Diese Verwendung unterliegt den containerübergreifenden Transaktionseinschränkungen, wie im Abschnitt Unterstützte Isolationsstufen für containerübergreifende Transaktionen des Themas Transaktionen mit speicheroptimierten Tabellenbeschrieben. Weitere Informationen zum Interop-Modus finden Sie unter Zugreifen auf speicheroptimierte Tabellen mit interpretiertem Transact-SQL.

Nativ kompilierte benutzerdefinierte Skalarfunktionen benötigen einen expliziten Ausführungskontext. Weitere Informationen finden Sie unter EXECUTE AS-Klausel (Transact-SQL). EXECUTE AS CALLER wird nicht unterstützt. Weitere Informationen finden Sie unter EXECUTE (Transact-SQL).

Die unterstützte Syntax für Transact-SQL-EXECUTE-Anweisungen für nativ kompilierte benutzerdefinierte Skalarfunktionen finden Sie unter EXECUTE (Transact-SQL). Die unterstützte Syntax zum Ausführen benutzerdefinierter Funktionen in einer nativ kompilierten gespeicherten Prozedur finden Sie unter Unterstützte Funktionen für nativ kompilierte T-SQL-Module.

Hinweise und Parameter

Die Unterstützung für Tabellen-, Join- und Abfragehinweise in nativ kompilierten benutzerdefinierten Skalarfunktionen entspricht der Unterstützung für diese Hinweise für nativ kompilierte gespeicherte Prozeduren. Wie bei interpretierten benutzerdefinierten Skalarfunktionen wirken sich die in einer Transact-SQL-Abfrage enthaltenen Abfragehinweise, die auf eine nativ kompilierte benutzerdefinierte Skalarfunktion verweisen, nicht auf den Abfrageplan für diese benutzerdefinierte Funktion aus.

Die für die nativ kompilierten benutzerdefinierten Skalarfunktionen unterstützten Parameter sind alle Parameter, die für nativ kompilierte gespeicherte Prozeduren unterstützt werden. Dies gilt nur, solange die Parameter für benutzerdefinierte Skalarfunktionen zulässig sind. Ein Beispiel für einen unterstützten Parameter ist der Tabellenwertparameter.

Schemagebunden

Folgendes gilt für nativ kompilierte benutzerdefinierte Skalarfunktionen.

  • Müssen schemagebunden sein, indem das WITH SCHEMABINDING-Argument in CREATE FUNCTION und ALTER FUNCTION verwendet wird.

  • Können nicht gelöscht oder geändert werden, wenn von einer schemagebundenen gespeicherten Prozedur oder einer benutzerdefinierten Funktion auf sie verwiesen wird.

SHOWPLAN_XML

Nativ kompilierte benutzerdefinierte Skalarfunktionen unterstützen SHOWPLAN_XML. Es entspricht dem allgemeinen SHOWPLAN_XML-Schema, wie bei nativ kompilierten gespeicherten Prozeduren. Das Basiselement für die benutzerdefinierten Funktionen ist <UDF>.

STATISTICS XML wird für nativ kompilierte benutzerdefinierte Skalarfunktionen nicht unterstützt. Beim Ausführen einer Abfrage mit Verweis auf die benutzerdefinierte Funktion mit aktivierter STATISTICS XML-Anweisung wird der XML-Inhalt ohne den Teil für die benutzerdefinierte Funktion zurückgegeben.

Berechtigungen

Wie bei nativ kompilierten gespeicherten Prozeduren werden beim Erstellen der Funktion die Berechtigungen für die Objekte überprüft, auf die von einer nativ kompilierten benutzerdefinierten Skalarfunktion verwiesen wird. CREATE FUNCTION schlägt fehl, wenn der Benutzer, dessen Identität angenommen wurde, nicht über die richtigen Berechtigungen verfügt. Wenn das Ändern der Berechtigungen dazu führt, dass der Benutzer, dessen Identität angenommen wurde, nicht mehr über die richtigen Berechtigungen verfügt, schlagen die nachfolgenden Ausführungen der benutzerdefinierten Funktion fehl.

Wenn Sie eine nativ kompilierte benutzerdefinierte Skalarfunktion in einer nativ kompilierten gespeicherten Prozedur verwenden, werden die Berechtigungen für die Ausführung der benutzerdefinierten Funktion beim Erstellen der äußeren Prozedur überprüft. Falls der Benutzer, dessen Identität von der äußeren Prozedur angenommen wurde, über keine EXEC-Berechtigungen für die benutzerdefinierte Funktion verfügt, schlägt die Erstellung der gespeicherten Prozedur fehl. Falls der Benutzer nach Ändern der Berechtigungen nicht mehr über EXEC-Berechtigungen verfügt, schlägt die Ausführung der äußeren Prozedur fehl.

Weitere Informationen

Integrierte Funktionen (Transact-SQL)
Speichern eines Ausführungsplans im XML-Format