Freigeben über


CREATE-FUNKTION

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, INSERTund DELETE
  • 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/ELSE und BEGIN/END Blöcke)
  • Lokale Variablen
  • Aufrufe integrierter SQL-Funktionen verfügbar
  • Aufrufe an andere UDFs
  • SELECT Anweisungen 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 FUNCTION Anweisung 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 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.

  • 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...CATCH Anweisungen
    • DECLARE Anweisungen 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 ... FROM Benutzertabelle nicht verwendet werden, wenn:

  • Skalare UDFs können in einer Abfrage nicht verwendet werden, wenn:

    • UDF wird direkt in einer GROUP BY Klausel aufgerufen.
    • UDF wird direkt in einer ORDER BY Klausel aufgerufen.
    • Das Aufrufen einer Abfrage weist einen allgemeinen Tabellenausdruck (CTE) auf.
  • 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';

Gilt für:Azure Synapse AnalyticsAnalytics 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 FUNCTION kö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 FUNCTION jedoch 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. SELECT

  • In 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 FUNCTION Anweisung 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.

Nächster Schritt