Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gilt für:SQL-Analyseendpunkt und Warehouse in Microsoft Fabric
CREATE FUNCTION kann Inlinetabellenwertfunktionen und skalare Funktionen erstellen.
Hinweis
Skalare UDFs sind ein Vorschaufeature in Fabric Data Warehouse.
Von Bedeutung
In Fabric Data Warehouse müssen skalare UDFs für die Verwendung mit Abfragen in SELECT ... FROM Benutzertabellen inlineierbar sein, Aber Sie können weiterhin Funktionen erstellen, die nicht inlineierbar sind. Skalare UDFs, die in begrenzter Anzahl von Szenarien nicht inlineierbar sind. Sie können überprüfen , ob eine UDF inlined sein kann.
Eine benutzerdefinierte Funktion ist eine Transact-SQL-Routine, die Parameter annimmt, eine Aktion ausführt (z. B. eine komplexe Berechnung) und das Ergebnis dieser Aktion als Wert zurückgeben kann. Skalare Funktionen geben einen skalaren Wert zurück, z. B. eine Zahl oder eine Zeichenfolge. Benutzerdefinierte Tabellenwertfunktionen (TVFs) geben eine Tabelle zurück.
Dient CREATE FUNCTION zum Erstellen einer wiederverwendbaren T-SQL-Routine, die auf folgende Weise verwendet werden kann:
- In Transact-SQL-Anweisungen, z. B.
SELECT - In Transact-SQL Datenmanipulationsanweisungen (DML) wie
UPDATE,INSERTundDELETE - In Anwendungen, die die Funktion aufrufen
- Bei der Definition einer anderen benutzerdefinierten Funktion
- Zum Ersetzen einer gespeicherten Prozedur
Tipp
Sie können angeben CREATE OR ALTER FUNCTION , dass eine neue Funktion erstellt wird, wenn sie nicht mit diesem Namen vorhanden ist, oder eine vorhandene Funktion in einer einzelnen Anweisung ändern.
Transact-SQL-Syntaxkonventionen
Syntax
Syntax der skalaren Funktion
CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] parameter_data_type
[ = default ] }
[ ,...n ]
]
)
RETURNS return_data_type
[ WITH <function_option> [ ,...n ] ]
[ AS ]
BEGIN
function_body
RETURN scalar_expression
END
[ ; ]
<function_option>::=
{
[ SCHEMABINDING ]
| [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]
}
Syntax der Inlinetabellenwertfunktion
CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] parameter_data_type
[ = default ] }
[ ,...n ]
]
)
RETURNS TABLE
[ WITH SCHEMABINDING ]
[ AS ]
RETURN [ ( ] select_stmt [ ) ]
[ ; ]
Argumente
schema_name
Der Name des Schemas, zu dem die benutzerdefinierte Funktion gehört.
function_name
Der Name der benutzerdefinierten Funktion. Funktionsnamen müssen den Regeln für Bezeichner entsprechen und innerhalb der Datenbank und für jedes Schema eindeutig sein.
Hinweis
Auf den Funktionsnamen müssen Klammern folgen, selbst wenn kein Parameter angegeben ist.
@ parameter_name
Ein Parameter in der benutzerdefinierten Funktion. Ein oder mehrere Parameter können deklariert werden.
Eine Funktion kann maximal 2.100 Parameter haben. Der Benutzer muss beim Ausführen einer Funktion den Wert jedes deklarierten Parameters angeben (sofern kein Standardwert für den betreffenden Parameter definiert ist).
Geben Sie einen Parameternamen an, der mit dem Zeichen ( @ ) beginnt. Der Parametername muss den Regeln für Bezeichner entsprechen. Parameter gelten lokal in der jeweiligen Funktion. Dieselben Parameternamen können in anderen Funktionen verwendet werden. Parameter können nur den Platz von Konstanten einnehmen. Sie können nicht anstelle von Tabellennamen, Spaltennamen oder Namen anderer Datenbankobjekte verwendet werden.
Hinweis
ANSI_WARNINGS wird nicht berücksichtigt, wenn Sie Parameter in einer gespeicherten Prozedur, benutzerdefinierten Funktion oder beim Deklarieren und Festlegen von Variablen in einer Batch-Anweisung übergeben. Wird beispielsweise eine Variable als char(3) definiert und dann auf einen Wert festgelegt, der länger als drei Zeichen ist, werden die Daten auf die definierte Größe abgeschnitten, und die Anweisung INSERT oder UPDATE wird erfolgreich ausgeführt.
parameter_data_type
Der Parameterdatentyp. Für Transact-SQL Funktionen sind alle unterstützten skalaren Datentypen zulässig.
[ = Standardeinstellung ]
Ein Standardwert für den Parameter. Wenn ein default-Wert definiert ist, kann die Funktion ausgeführt werden, ohne dass ein Wert für diesen Parameter angegeben werden muss.
Wenn ein Parameter der Funktion einen Standardwert hat, muss das Schlüsselwort DEFAULT angegeben werden, wenn die Funktion aufgerufen wird, um den Standardwert abzurufen. In diesem Punkt gibt es einen Unterschied zum Verwenden von Parametern in einer gespeicherten Prozedur. Fehlt im Aufruf einer gespeicherten Prozedur ein Parameter, der einen Standardwert hat, wird automatisch dieser Standardwert verwendet.
return_data_type
Der Rückgabewert einer benutzerdefinierten skalaren Funktion.
Für Funktionen in Fabric Data Warehouse sind alle Datentypen mit Ausnahme desZeilenversions-Zeitstempels/ zulässig. Nicht skalarische Typen wie Tabelle sind nicht zulässig.
function_body
Eine Reihe von Transact-SQL Anweisungen.
In skalaren Funktionen ist function_body eine Reihe von Transact-SQL Anweisungen, die zusammen zu einem skalaren Wert ausgewertet werden, der Folgendes umfassen kann:
- Einzelner Anweisungsausdruck
- Ausdrücke mit mehreren Anweisungen (
IF/THEN/ELSEundBEGIN/ENDBlöcke) - Lokale Variablen
- Aufrufe integrierter SQL-Funktionen verfügbar
- Aufrufe an andere UDFs
-
SELECTAnweisungen und Verweise auf Tabellen, Ansichten und Inlinetabellenwertfunktionen
scalar_expression
Gibt den skalaren Wert an, den die Skalarfunktion zurückgibt.
select_stmt
Die einzelne SELECT Anweisung, die den Rückgabewert einer Inlinetabellenwertfunktion definiert. Für eine inlinetabellenwertige Funktion gibt es keinen Funktionstext; die Tabelle ist das Resultset einer einzelnen SELECT Anweisung.
Tabelle
Gibt an, dass der Rückgabewert der Tabellenwertfunktion eine Tabelle ist. Nur Konstanten und @local_variables können an Tabellenwertfunktionen übergeben werden.
In inline TVFs (Vorschau) wird der TABLE-Rückgabewert über eine einzelne SELECT Anweisung definiert. Inlinefunktionen haben keine zugeordneten Rückgabevariablen.
<function_option>
In Fabric Data Warehouse werden die Schlüsselwörter INLINE, und ENCRYPTION die EXECUTE ASSchlüsselwörter nicht unterstützt.
Zu den unterstützten Funktionsoptionen gehören:
SCHEMABINDING
Gibt an, dass die Funktion an die Datenbankobjekte gebunden ist, auf die sie verweist. Wenn SCHEMABINDING angegeben ist, können an Basisobjekten keine Änderungen vorgenommen werden, die die Funktionsdefinition betreffen können. Zunächst muss die Funktionsdefinition selbst geändert oder gelöscht werden, um Abhängigkeiten in dem zu ändernden Objekt zu entfernen.
Die Bindung der Funktion an die Objekte, auf die sie verweist, wird nur bei einer der folgenden Aktionen entfernt:
Die Funktion wird gelöscht.
Die Funktion wird mithilfe der ALTER-Anweisung geändert, wobei die Option SCHEMABINDING nicht angegeben ist.
Eine Funktion kann nur dann schemagebunden sein, wenn die folgenden Bedingungen erfüllt sind:
Alle benutzerdefinierten Funktionen, auf die die Funktion verweist, sind ebenfalls schemagebunden.
Die Objekte, auf die von der Funktion verwiesen wird, werden mit einem zweiteiligen Namen referenziert.
Nur auf integrierte Funktionen und andere benutzerdefinierte Funktionen in der gleichen Datenbank kann im Text der benutzerdefinierten Funktionen verwiesen werden.
Der Benutzer, der die
CREATE FUNCTIONAnweisung ausgeführt hat, verfügt über DIE REFERENCES-Berechtigung für die Datenbankobjekte, auf die die Funktion verweist.
Um SCHEMABINDING zu entfernen, verwenden Sie ALTER.
GIBT NULL FÜR NULL-EINGABE ZURÜCK | AUFGERUFEN BEI NULLEINGABE
Gibt das OnNULLCall Attribut einer skalarwertigen Funktion an. Wenn nicht angegeben, CALLED ON NULL INPUT wird standardmäßig impliziert, und der Funktionstext wird auch dann ausgeführt, wenn NULL er als Argument übergeben wird.
Bewährte Methoden
Wenn eine benutzerdefinierte Funktion nicht mit schemabinding erstellt wird, können Sich änderungen, die an zugrunde liegenden Objekten vorgenommen werden, auf die Definition der Funktion auswirken und unerwartete Ergebnisse erzeugen, wenn sie aufgerufen wird. Es wird empfohlen, die
WITH SCHEMABINDINGKlausel beim Erstellen der Funktion anzugeben. Hiermit wird sichergestellt, dass die Objekte, auf die in der Funktionsdefinition verwiesen wird, nicht geändert werden können, es sei denn, die Funktion wird auch geändert.Schreiben Sie Ihre benutzerdefinierten Funktionen so, dass sie inlineierbar sind. Weitere Informationen finden Sie unter Inlining benutzerdefinierter Skalarfunktionen.
Interoperabilität
Benutzerdefinierte Inline-Funktionen mit Tabellenwert
In einer Inlinetabellenwertfunktion ist nur eine einzelne Select-Anweisung zulässig.
Benutzerdefinierte Skalarfunktionen
Die folgenden Anweisungen sind in Skalarwertfunktionen gültig:
- Zuweisungsanweisungen
- Control-of-Flow-Anweisungen außer
TRY...CATCHAnweisungen -
DECLAREAnweisungen zum Definieren lokaler Datenvariablen
Die folgenden integrierten Funktionen werden in einem skalaren Funktionstext nicht unterstützt:
Skalare UDFs können in einer Abfrage für eine
SELECT ... FROMBenutzertabelle nicht verwendet werden, wenn:- Der UDF-Text enthält einen Aufruf einer nicht deterministischen integrierten Funktion, siehe Deterministische und nichtdeterministische Funktionen.
- Der UDF-Text enthält einen allgemeinen Tabellenausdruck (CTE).
- Der UDF-Text enthält UDF-Textkörper mit mehreren Anweisungen über sechs
IF-THEN-ELSEBlöcke hinaus. - Der UDF-Text enthält eine WHILE LOOP
- Der UDF-Text kann aus anderen Gründen nicht inlineiert werden. Weitere Informationen finden Sie unter Skalar UDF-Inlininganforderungen.
Skalare UDFs können in einer Abfrage nicht verwendet werden, wenn:
- UDF wird direkt in einer
GROUP BYKlausel aufgerufen. - UDF wird direkt in einer
ORDER BYKlausel aufgerufen. - Das Aufrufen einer Abfrage weist einen allgemeinen Tabellenausdruck (CTE) auf.
- UDF wird direkt in einer
Rekursive skalare UDFs werden nicht unterstützt.
Eine Benutzerabfrage kann fehlschlagen, wenn mehr als 10 UDF-Aufrufe in einer einzelnen Abfrage ausgeführt werden.
In einigen Edgefällen verhindert die Komplexität der Benutzerabfrage und des UDF-Textkörpers die Inlinierung, in diesem Fall ist die skalare UDF nicht inlineiert, und die Benutzerabfrage schlägt fehl.
Wenn eine skalare UDF in einem nicht unterstützten Szenario verwendet wird, wird eine Fehlermeldung "
Scalar UDF execution is currently unavailable in this context." angezeigt.
Begrenzungen
Hinweis
Während der aktuellen Vorschau können einschränkungen geändert werden.
Mit benutzerdefinierten Funktionen können keine Aktionen ausgeführt werden, die den Status einer Datenbank ändern.
Benutzerdefinierte Funktionen können geschachtelt werden. Dies bedeutet, dass eine benutzerdefinierte Funktion eine andere aufrufen kann. Die Schachtelungsebene wird um eins erhöht, wenn die aufgerufene Funktion mit der Ausführung beginnt, und wird wieder um eins erniedrigt, wenn die aufgerufene Funktion die Ausführung beendet. Benutzerdefinierte Funktionen in Fabric Data Warehouse können bis zu vier Ebenen geschachtelt werden, wenn ein UDF-Textkörper auf eine Tabellen-/Ansichts-/In-Line-Funktion mit Tabellenwert oder auf bis zu 32 Ebenen verweist. Das Überschreiten der maximalen Schachtelungsebenen führt dazu, dass die aufrufende Funktionskette fehlschlägt.
Metadaten
In diesem Abschnitt werden die Systemkatalogsichten aufgelistet, die Sie verwenden können, um Metadaten zu benutzerdefinierten Funktionen zurückzugeben.
sys.sql_modules: Zeigt die Definition von Transact-SQL benutzerdefinierten Funktionen an. Beispiel:
SELECT definition, type FROM sys.sql_modules AS m JOIN sys.objects AS o ON m.object_id = o.object_id AND type = ('FN');sys.parameters: Zeigt Informationen zu den parametern an, die in benutzerdefinierten Funktionen definiert sind.
sys.sql_expression_dependencies: Zeigt die zugrunde liegenden Objekte an, auf die von einer Funktion verwiesen wird.
Berechtigungen
Mitglieder der Rollen "Fabric-Arbeitsbereichadministrator", "Mitglied" und "Mitwirkender" können Funktionen erstellen.
Inlining benutzerdefinierter Skalarfunktionen
Microsoft Fabric Data Warehouse verwendet skalare UDF-Inlining , um benutzerdefinierten Code auf verteilte Weise zu kompilieren und auszuführen. Skalare UDF-Inlining ist standardmäßig aktiviert.
Während skalare UDF-Inlining eine in Microsoft SQL Server 2019 (15.0) eingeführte Leistungsoptimierungsmethode ist, bestimmt sie in Fabric Data Warehouse die unterstützten Szenarien. In Fabric Data Warehouse werden skalare UDFs automatisch in skalare Ausdrücke oder skalare Unterabfragen transformiert, die anstelle des UDF-Operators in der Aufrufenabfrage ersetzt werden.
Einige T-SQL-Syntax macht eine skalare UDF nicht inlineierbar. Funktionen, die eine WHILE Schleife, mehrere RETURN Anweisungen oder einen Aufruf einer nicht deterministischen integrierten SQL-Funktion (z GETUTCDATE() . B. oder GETDATE()) enthalten, können nicht inlineiert werden. Weitere Informationen finden Sie unter Skalar UDF-Inlininganforderungen.
Überprüfen, ob eine skalare UDF inlined sein kann
Die sys.sql_modules Katalogansicht enthält die Spalte is_inlineable, die angibt, ob eine UDF inlineierbar ist.
Die is_inlineable Eigenschaft wird von der Überprüfung der Syntax innerhalb der UDF-Definition abgeleitet. Die skalare UDF wird vor der Kompilierungszeit nicht inlineiert. Ein Wert, der 1 angibt, dass die UDF inlineierbar ist, während ein Wert angibt 0 , dass sie nicht inlineierbar ist. Wenn eine skalare UDF inlineierbar ist, wird sie nicht garantiert, dass sie immer inlineiert wird, wenn die Abfrage kompiliert wird.
Fabric Data Warehouse entscheidet (pro Abfrage), ob eine UDF abhängig von der gesamten Abfragekomplexität inline werden soll.
Verwenden Sie die folgende Beispielabfrage, um zu überprüfen, ob eine skalare UDF inlineierbar ist:
SELECT
SCHEMA_NAME(b.schema_id) as function_schema_name,
b.name as function_name,
b.type_desc as function_type,
a.is_inlineable
FROM sys.sql_modules AS a
INNER JOIN sys.objects AS b
ON a.object_id = b.object_id
WHERE b.type IN ('FN');
Wenn eine skalare Funktion nicht inlineierbar sys.sql_modules.is_inlineableist, können Sie die Abfrage weiterhin als eigenständigen Aufruf ausführen, um beispielsweise eine Variable festzulegen. Die skalare Funktion kann jedoch nicht Teil einer SELECT ... FROM Abfrage in einer Benutzertabelle sein. Beispiel:
CREATE FUNCTION [dbo].[custom_SYSUTCDATETIME]()
RETURNS datetime2(6)
AS
BEGIN
RETURN SYSUTCDATETIME();
END
Die benutzerdefinierte Beispielfunktion dbo.custom_SYSUTCDATETIME ist aufgrund der Verwendung einer nicht bestimmten Systemfunktion SYSUTCDATETIME()nicht inlineierbar. Sie schlägt fehl, wenn sie in einer Abfrage in einer SELECT ... FROM Benutzertabelle verwendet wird, aber als eigenständiger Aufruf erfolgreich ausgeführt wird, z. B.:
DECLARE @utcdate datetime2(7);
SET @utcdate = dbo.custom_SYSUTCDATETIME();
SELECT @utcdate as 'utc_date';
Beispiele
Ein. Erstellen einer Inline-Tabellenwertfunktion
Im folgenden Beispiel wird eine Inline-Tabellenwertfunktion erstellt, um einige wichtige Informationen zu Modulen zurückzugeben, die nach dem objectType-Parameter gefiltert werden. Sie enthält einen Standardwert, um alle Module zurückzugeben, wenn die Funktion mit dem DEFAULT Parameter aufgerufen wird. In diesem Beispiel werden einige der Systemkatalogansichten verwendet, die in Metadaten erwähnt werden.
CREATE FUNCTION dbo.ModulesByType (@objectType CHAR(2) = '%%')
RETURNS TABLE
AS
RETURN (
SELECT sm.object_id AS 'Object Id',
o.create_date AS 'Date Created',
OBJECT_NAME(sm.object_id) AS 'Name',
o.type AS 'Type',
o.type_desc AS 'Type Description',
sm.DEFINITION AS 'Module Description',
sm.is_inlineable AS 'Inlineable'
FROM sys.sql_modules AS sm
INNER JOIN sys.objects AS o ON sm.object_id = o.object_id
WHERE o.type LIKE '%' + @objectType + '%'
);
GO
Die Funktion kann dann aufgerufen werden, um alle inlinetabellenwertigen Funktionen (IF) mit folgendem Wert zurückzugeben:
SELECT * FROM dbo.ModulesByType('IF'); -- SQL_INLINE_TABLE_VALUED_FUNCTION
Oder suchen Sie alle skalaren Funktionen (FN):
SELECT * FROM dbo.ModulesByType('FN'); -- SQL_SCALAR_FUNCTION
B. Kombinieren von Ergebnissen einer Inlinetabellenwertfunktion
In diesem einfachen Beispiel wird die zuvor erstellte Tabellenwertfunktion verwendet, um zu zeigen, wie ihre Ergebnisse mithilfe von CROSS APPLY mit anderen Tabellen kombiniert werden können. Hier wählen wir alle Spalten aus und sys.objects die Ergebnisse ModulesByType aller Zeilen, die in der type Spalte übereinstimmen. Weitere Informationen zur Verwendung von Apply finden Sie unter FROM-Klausel plus JOIN, APPLY, PIVOT (Transact-SQL).
SELECT *
FROM sys.objects AS o
CROSS APPLY dbo.ModulesByType(o.type);
GO
C. Erstellen einer skalaren UDF-Funktion
Im folgenden Beispiel wird eine inlineierbare skalare UDF erstellt, die einen Eingabetext maskiert.
CREATE OR ALTER FUNCTION [dbo].[cleanInput] (@InputString VARCHAR(100))
RETURNS VARCHAR(50)
AS
BEGIN
DECLARE @Result VARCHAR(50)
DECLARE @CleanedInput VARCHAR(50)
-- Trim whitespace
SET @CleanedInput = LTRIM(RTRIM(@InputString))
-- Handle empty or null input
IF @CleanedInput = '' OR @CleanedInput IS NULL
BEGIN
SET @Result = ''
END
ELSE IF LEN(@CleanedInput) <= 2
BEGIN
-- If string length is 1 or 2, just return the cleaned string
SET @Result = @CleanedInput
END
ELSE
BEGIN
-- Construct the masked string
SET @Result =
LEFT(@CleanedInput, 1) +
REPLICATE('*', LEN(@CleanedInput) - 2) +
RIGHT(@CleanedInput, 1)
END
RETURN @Result
END
Sie können die Funktion wie folgt aufrufen:
DECLARE @input varchar(100) = '123456789'
SELECT dbo.cleanInput (@input) AS function_output;
Weitere Beispiele für die Verwendung skalarer UDFs in Fabric Data Warehouse:
In einer SELECT Anweisung:
SELECT TOP 10
t.id, t.name,
dbo.cleanInput (t.name) AS function_output
FROM dbo.MyTable AS t;
In einer WHERE Klausel:
SELECT t.id, t.name, dbo.cleanInput(t.name) AS function_output
FROM dbo.MyTable AS t
WHERE dbo.cleanInput(t.name)='myvalue'
In einer JOIN Klausel:
SELECT t1.id, t1.name,
dbo.cleanInput (t1.name) AS function_output,
dbo.cleanInput (t2.name) AS function_output_2
FROM dbo.MyTable1 AS t1
INNER JOIN dbo.MyTable2 AS t2
ON dbo.cleanInput(t1.name)=dbo.cleanInput(t2.name);
In einer ORDER BY Klausel:
SELECT t.id, t.name, dbo.cleanInput (t.name) AS function_output
FROM dbo.MyTable AS t
ORDER BY function_output;
In DML-Anweisungen (Data Manipulation Language) wie INSERT, oder UPDATEDELETE:
SELECT t.id, t.name, dbo.cleanInput (t.name) AS function_output
INTO dbo.MyTable_new
FROM dbo.MyTable AS t;
UPDATE t
SET t.mycolumn_new = dbo.cleanInput (t.name)
FROM dbo.MyTable AS t;
DELETE t
FROM dbo.MyTable AS t
WHERE dbo.cleanInput (t.name) ='myvalue';
Verwandte Inhalte
Gilt für:Azure Synapse Analytics
Analytics Platform System (PDW)
Erstellt eine benutzerdefinierte Funktion (UDF) in Azure Synapse Analytics oder Analytics Platform System (PDW). Eine benutzerdefinierte Funktion ist eine Transact-SQL-Routine, die Parameter annimmt, eine Aktion ausführt (z. B. eine komplexe Berechnung) und das Ergebnis dieser Aktion als Wert zurückgeben kann. Benutzerdefinierte Tabellenwertfunktionen (TVFs) geben einen table-Datentyp zurück.
Tipp
Für die Syntax im Fabric Data Warehouse siehe die Version von CREATE FUNCTION für Fabric Data Warehouse.
In Analytics-Plattformsystem (PDW) muss der Rückgabewert ein Skalarwert (Einzelwert) sein.
In Azure Synapse Analytics
CREATE FUNCTIONkönnen Sie eine Tabelle mithilfe der Syntax für inlinetabellenwertige Funktionen (Vorschau) zurückgeben oder einen einzelnen Wert mithilfe der Syntax für skalare Funktionen zurückgeben.In serverlosen SQL-Pools in Azure Synapse Analytics können Inline-Tabellenwertfunktionen erstellt werden,
CREATE FUNCTIONjedoch keine skalaren Funktionen.Verwenden Sie diese Anweisung zum Erstellen einer wiederverwendbaren Routine, die auf folgende Weise verwendet werden kann:
In Transact-SQL-Anweisungen, z. B.
SELECTIn Anwendungen, die die Funktion aufrufen
Bei der Definition einer anderen benutzerdefinierten Funktion
Zum Definieren einer CHECK-Einschränkung für eine Spalte
Zum Ersetzen einer gespeicherten Prozedur
Zum Verwenden einer Inlinefunktion als Filterprädikat für eine Sicherheitsrichtlinie
Transact-SQL-Syntaxkonventionen
Syntax
Syntax der skalaren Funktion
-- Transact-SQL Scalar Function Syntax (in dedicated pools in Azure Synapse Analytics and Parallel Data Warehouse)
-- Not available in the serverless SQL pools in Azure Synapse Analytics
CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] parameter_data_type
[ = default ] }
[ ,...n ]
]
)
RETURNS return_data_type
[ WITH <function_option> [ ,...n ] ]
[ AS ]
BEGIN
function_body
RETURN scalar_expression
END
[ ; ]
<function_option>::=
{
[ SCHEMABINDING ]
| [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]
}
Syntax der Inlinetabellenwertfunktion
-- Transact-SQL Inline Table-Valued Function Syntax
-- Preview in dedicated SQL pools in Azure Synapse Analytics
-- Available in the serverless SQL pools in Azure Synapse Analytics
CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] parameter_data_type
[ = default ] }
[ ,...n ]
]
)
RETURNS TABLE
[ WITH SCHEMABINDING ]
[ AS ]
RETURN [ ( ] select_stmt [ ) ]
[ ; ]
Argumente
schema_name
Der Name des Schemas, zu dem die benutzerdefinierte Funktion gehört.
function_name
Der Name der benutzerdefinierten Funktion. Funktionsnamen müssen den Regeln für Bezeichner entsprechen und innerhalb der Datenbank und für jedes Schema eindeutig sein.
Hinweis
Auf den Funktionsnamen müssen Klammern folgen, selbst wenn kein Parameter angegeben ist.
@ parameter_name
Ein Parameter in der benutzerdefinierten Funktion. Ein oder mehrere Parameter können deklariert werden.
Eine Funktion kann maximal 2.100 Parameter haben. Der Benutzer muss beim Ausführen einer Funktion den Wert jedes deklarierten Parameters angeben (sofern kein Standardwert für den betreffenden Parameter definiert ist).
Geben Sie einen Parameternamen an, der mit dem Zeichen ( @ ) beginnt. Der Parametername muss den Regeln für Bezeichner entsprechen. Parameter gelten lokal in der jeweiligen Funktion. Dieselben Parameternamen können in anderen Funktionen verwendet werden. Parameter können nur den Platz von Konstanten einnehmen. Sie können nicht anstelle von Tabellennamen, Spaltennamen oder Namen anderer Datenbankobjekte verwendet werden.
Hinweis
ANSI_WARNINGS wird nicht berücksichtigt, wenn Sie Parameter in einer gespeicherten Prozedur, benutzerdefinierten Funktion oder beim Deklarieren und Festlegen von Variablen in einer Batch-Anweisung übergeben. Wird beispielsweise eine Variable als char(3) definiert und dann auf einen Wert festgelegt, der länger als drei Zeichen ist, werden die Daten auf die definierte Größe abgeschnitten, und die Anweisung INSERT oder UPDATE wird erfolgreich ausgeführt.
parameter_data_type
Der Parameterdatentyp. Für Transact-SQL-Funktionen sind alle skalaren Datentypen zulässig, die in Azure Synapse Analytics unterstützt werden. Der Datentyp timestamp (rowversion) wird nicht unterstützt.
[ = Standardeinstellung ]
Ein Standardwert für den Parameter. Wenn ein default-Wert definiert ist, kann die Funktion ausgeführt werden, ohne dass ein Wert für diesen Parameter angegeben werden muss.
Wenn ein Parameter der Funktion über einen Standardwert verfügt, muss beim Aufrufen der Funktion das DEFAULT-Schlüsselwort angegeben werden, um den Standardwert abzurufen. In diesem Punkt gibt es einen Unterschied zum Verwenden von Parametern in einer gespeicherten Prozedur. Fehlt im Aufruf einer gespeicherten Prozedur ein Parameter, der einen Standardwert hat, wird automatisch dieser Standardwert verwendet.
return_data_type
Der Rückgabewert einer benutzerdefinierten skalaren Funktion. Für Transact-SQL-Funktionen sind alle skalaren Datentypen zulässig, die in Azure Synapse Analytics unterstützt werden. Der Datentyp "Rowversion/timestamp" ist kein unterstützter Typ. Der Cursor und die Tabelle von nicht skalaren Typen sind nicht zulässig.
function_body
Sequenz von Transact-SQL-Anweisungen. Die function_body kann keine SELECT Anweisung enthalten und kann nicht auf Datenbankdaten verweisen. Der function_body kann nicht auf Tabellen oder Ansichten verweisen. function_body kann andere deterministische Funktionen aufrufen, jedoch keine nicht deterministischen Funktionen aufrufen.
In Skalarfunktionen entspricht function_body einer Reihe von Transact-SQL-Anweisungen, die zusammen einen Skalarwert ergeben.
scalar_expression
Gibt den skalaren Wert an, den die Skalarfunktion zurückgibt.
select_stmt
Die einzelne SELECT Anweisung, die den Rückgabewert einer Inlinetabellenwertfunktion definiert. Für eine inlinetabellenwertige Funktion gibt es keinen Funktionstext; die Tabelle ist das Resultset einer einzelnen SELECT Anweisung.
Tabelle
Gibt an, dass der Rückgabewert der Tabellenwertfunktion eine Tabelle ist. Nur Konstanten und @local_variables können an Tabellenwertfunktionen übergeben werden.
In inline TVFs (Vorschau) wird der TABLE-Rückgabewert über eine einzelne SELECT Anweisung definiert. Inlinefunktionen haben keine zugeordneten Rückgabevariablen.
<function_option>
Gibt an, dass die Funktion über eine oder mehrere der folgenden Optionen verfügt.
SCHEMABINDING
Gibt an, dass die Funktion an die Datenbankobjekte gebunden ist, auf die sie verweist. Wenn SCHEMABINDING angegeben ist, können an Basisobjekten keine Änderungen vorgenommen werden, die die Funktionsdefinition betreffen können. Zunächst muss die Funktionsdefinition selbst geändert oder gelöscht werden, um Abhängigkeiten in dem zu ändernden Objekt zu entfernen.
Die Bindung der Funktion an die Objekte, auf die sie verweist, wird nur bei einer der folgenden Aktionen entfernt:
Die Funktion wird gelöscht.
Die Funktion wird mithilfe der ALTER-Anweisung geändert, wobei die Option SCHEMABINDING nicht angegeben ist.
Eine Funktion kann nur dann schemagebunden sein, wenn die folgenden Bedingungen erfüllt sind:
Alle benutzerdefinierten Funktionen, auf die die Funktion verweist, sind ebenfalls schemagebunden.
Auf die Funktionen und die anderen benutzerdefinierten Funktionen, auf die die Funktion verweist, wird unter Verwendung eines einteiligen oder zweiteiligen Namens verwiesen.
Nur auf integrierte Funktionen und andere benutzerdefinierte Funktionen in der gleichen Datenbank kann im Text der benutzerdefinierten Funktionen verwiesen werden.
Der Benutzer, der die
CREATE FUNCTIONAnweisung ausgeführt hat, verfügt über DIE REFERENCES-Berechtigung für die Datenbankobjekte, auf die die Funktion verweist.
Um SCHEMABINDING zu entfernen, verwenden Sie ALTER.
GIBT NULL FÜR NULL-EINGABE ZURÜCK | AUFGERUFEN BEI NULLEINGABE
Gibt das OnNULLCall Attribut einer skalarwertigen Funktion an. Wenn nicht angegeben, CALLED ON NULL INPUT wird standardmäßig impliziert, und der Funktionstext wird auch dann ausgeführt, wenn NULL er als Argument übergeben wird.
Bewährte Methoden
Wenn eine benutzerdefinierte Funktion nicht mit der SCHEMABINDING-Klausel erstellt wurde, können sich die an zugrunde liegenden Objekten vorgenommenen Änderungen auf die Definition der Funktion auswirken und bei Aufruf der Funktion zu unerwarteten Ergebnissen führen. Es wird empfohlen, die WITH SCHEMABINDING Klausel beim Erstellen der Funktion anzugeben. Hiermit wird sichergestellt, dass die Objekte, auf die in der Funktionsdefinition verwiesen wird, nicht geändert werden können, es sei denn, die Funktion wird auch geändert.
Interoperabilität
Die folgenden Anweisungen sind in Skalarwertfunktionen gültig:
Zuweisungsanweisungen
Anweisungen zur Ablaufsteuerung, mit Ausnahme von TRY...CATCH-Anweisungen
DECLARE-Anweisungen zum Definieren lokaler Datenbankvariablen.
In einer Inline-Tabellenwertfunktion (Vorschau) ist nur eine einzelne SELECT-Anweisung zulässig.
Begrenzungen
Mit benutzerdefinierten Funktionen können keine Aktionen ausgeführt werden, die den Status einer Datenbank ändern.
Benutzerdefinierte Funktionen können geschachtelt werden. Dies bedeutet, dass eine benutzerdefinierte Funktion eine andere aufrufen kann. Die Schachtelungsebene wird um eins erhöht, wenn die aufgerufene Funktion mit der Ausführung beginnt, und wird wieder um eins erniedrigt, wenn die aufgerufene Funktion die Ausführung beendet. Ein Überschreiten der maximalen Schachtelungsebenen verursacht das Fehlschlagen der gesamten Funktionsaufrufskette.
Objekte, einschließlich Funktionen, können nicht in der master-Datenbank Ihres serverlosen SQL-Pools in Azure Synapse Analytics erstellt werden.
Metadaten
In diesem Abschnitt werden die Systemkatalogsichten aufgelistet, die Sie verwenden können, um Metadaten zu benutzerdefinierten Funktionen zurückzugeben.
sys.sql_modules: Zeigt die Definition von Transact-SQL benutzerdefinierten Funktionen an. Beispiel:
SELECT definition, type FROM sys.sql_modules AS m JOIN sys.objects AS o ON m.object_id = o.object_id AND type = ('FN');sys.parameters: Zeigt Informationen zu den parametern an, die in benutzerdefinierten Funktionen definiert sind.
sys.sql_expression_dependencies: Zeigt die zugrunde liegenden Objekte an, auf die von einer Funktion verwiesen wird.
Berechtigungen
Erfordert die CREATE FUNCTION-Berechtigung in der Datenbank und die ALTER-Berechtigung für das Schema, in dem die Funktion erstellt wird.
Beispiele
Ein. Verwenden einer benutzerdefinierten Skalarwertfunktion zum Ändern eines Datentyps
Diese einfache Funktion verwendet einen int-Datentyp als Eingabe und gibt einen decimal(10,2) -Datentyp als Ausgabe zurück.
CREATE FUNCTION dbo.ConvertInput (@MyValueIn int)
RETURNS decimal(10,2)
AS
BEGIN
DECLARE @MyValueOut int;
SET @MyValueOut= CAST( @MyValueIn AS decimal(10,2));
RETURN(@MyValueOut);
END;
GO
SELECT dbo.ConvertInput(15) AS 'ConvertedValue';
Hinweis
Skalare Funktionen sind in den serverlosen SQL-Pools nicht verfügbar.
B. Erstellen einer Inline-Tabellenwertfunktion
Im folgenden Beispiel wird eine Inline-Tabellenwertfunktion erstellt, um einige wichtige Informationen zu Modulen zurückzugeben, die nach dem objectType-Parameter gefiltert werden. Sie enthält einen Standardwert, um alle Module zurückzugeben, wenn die Funktion mit dem DEFAULT Parameter aufgerufen wird. In diesem Beispiel werden einige der Systemkatalogansichten verwendet, die in Metadaten erwähnt werden.
CREATE FUNCTION dbo.ModulesByType(@objectType CHAR(2) = '%%')
RETURNS TABLE
AS
RETURN
(
SELECT
sm.object_id AS 'Object Id',
o.create_date AS 'Date Created',
OBJECT_NAME(sm.object_id) AS 'Name',
o.type AS 'Type',
o.type_desc AS 'Type Description',
sm.definition AS 'Module Description'
FROM sys.sql_modules AS sm
JOIN sys.objects AS o ON sm.object_id = o.object_id
WHERE o.type like '%' + @objectType + '%'
);
GO
Die Funktion kann dann aufgerufen werden, um alle Ansichtsobjekte (V) mit:
select * from dbo.ModulesByType('V');
Hinweis
Inline-Tabellenwertfunktionen sind in den serverlosen SQL-Pools verfügbar, aber in den dedizierten SQL-Pools in der Vorschau.
C. Kombinieren von Ergebnissen einer Inlinetabellenwertfunktion
In diesem einfachen Beispiel wird die zuvor erstellte Tabellenwertfunktion verwendet, um zu zeigen, wie ihre Ergebnisse mithilfe von CROSS APPLY mit anderen Tabellen kombiniert werden können. Hier wählen wir alle Spalten aus und sys.objects die Ergebnisse ModulesByType aller Zeilen, die in der type Spalte übereinstimmen. Weitere Informationen zur Verwendung von Apply finden Sie unter FROM-Klausel plus JOIN, APPLY, PIVOT (Transact-SQL).
SELECT *
FROM sys.objects o
CROSS APPLY dbo.ModulesByType(o.type);
GO
Hinweis
Inline-Tabellenwertfunktionen sind in den serverlosen SQL-Pools verfügbar, aber in den dedizierten SQL-Pools in der Vorschau.