Dela via


SKAPA FUNKTION

gäller för:SQL-analysslutpunkt och lager i Microsoft Fabric

CREATE FUNCTION kan skapa infogade tabellvärdesfunktioner och skalärfunktioner.

Anmärkning

Skalära UDF:er är en förhandsversionsfunktion i Fabric Data Warehouse.

Viktigt!

I Infrastrukturdatalager måste skalära UDF:er vara infogade för användning med SELECT ... FROM frågor i användartabeller, men du kan fortfarande skapa funktioner som inte är infogade. Skalära UDF:er som inte är linjära fungerar i ett begränsat antal scenarier. Du kan kontrollera om en UDF kan infogas.

En användardefinierad funktion är en Transact-SQL rutin som accepterar parametrar, utför en åtgärd, till exempel en komplex beräkning, och returnerar resultatet av åtgärden som ett värde. Skalärfunktioner returnerar ett skalärt värde, till exempel ett tal eller en sträng. Användardefinierade tabellvärdesfunktioner returnerar en tabell.

Använd CREATE FUNCTION för att skapa en återanvändbar T-SQL-rutin som kan användas på följande sätt:

  • I Transact-SQL uttalanden som SELECT
  • I Transact-SQL instruktioner för datamanipulering (DML), till exempel UPDATE, INSERToch DELETE
  • I program som anropar funktionen
  • I definitionen av en annan användardefinierad funktion
  • Så här ersätter du en lagrad procedur

Tips/Råd

Du kan ange CREATE OR ALTER FUNCTION om du vill skapa en ny funktion om den inte finns med det namnet eller om du ändrar en befintlig funktion i en enda instruktion.

Transact-SQL syntaxkonventioner

Syntax

Syntax för skalär 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 ]  
}  

Funktionssyntax för infogad tabellvärde

CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] parameter_data_type
    [ = default ] }
    [ ,...n ]
  ]
)
RETURNS TABLE
    [ WITH SCHEMABINDING ]
    [ AS ]
    RETURN [ ( ] select_stmt [ ) ]
[ ; ]

Argumentpunkter

schema_name

Namnet på det schema som den användardefinierade funktionen tillhör.

function_name

Namnet på den användardefinierade funktionen. Funktionsnamn måste följa reglerna för identifierare och måste vara unika i databasen och för dess schema.

Anmärkning

Parenteser krävs efter funktionsnamnet även om en parameter inte har angetts.

@ parameter_name

En parameter i den användardefinierade funktionen. En eller flera parametrar kan deklareras.

En funktion kan ha högst 2 100 parametrar. Värdet för varje deklarerad parameter måste anges av användaren när funktionen körs, såvida inte ett standardvärde för parametern har definierats.

Ange ett parameternamn med hjälp av ett vidtecken (@) som det första tecknet. Parameternamnet måste överensstämma med reglerna för identifierare. Parametrarna är lokala för funktionen. Samma parameternamn kan användas i andra funktioner. Parametrar kan bara ta plats för konstanter. De kan inte användas i stället för tabellnamn, kolumnnamn eller namn på andra databasobjekt.

Anmärkning

ANSI_WARNINGS respekteras inte när du skickar parametrar i en lagrad procedur, användardefinierad funktion eller när du deklarerar och anger variabler i en batch-instruktion. Om en variabel till exempel definieras som tecken(3) och sedan anges till ett värde som är större än tre tecken trunkeras data till den definierade storleken och INSERT- eller UPDATE-instruktionen lyckas.

parameter_data_type

Parameterdatatypen. För Transact-SQL funktioner tillåts alla skalära datatyper som stöds .

[ = standard ]

Ett standardvärde för parametern. Om ett standardvärde definieras kan funktionen köras utan att ange ett värde för den parametern.

När en parameter för funktionen har ett standardvärde måste nyckelordet DEFAULT anges när funktionen anropas för att hämta standardvärdet. Det här beteendet skiljer sig från att använda parametrar med standardvärden i lagrade procedurer där utelämnande av parametern också innebär standardvärdet.

return_data_type

Returvärdet för en skalär användardefinierad funktion.

För funktioner i Fabric Data Warehouse tillåts alla datatyper förutomtidsstämpelnrowversion/. Icke-skalära typer som tabell tillåts inte.

function_body

En serie Transact-SQL-instruktioner.

I skalärfunktioner är function_body en serie Transact-SQL-instruktioner som tillsammans utvärderas till ett skalärt värde, vilket kan omfatta:

  • Uttryck för en sats
  • Uttryck med flera uttryck (IF/THEN/ELSE och BEGIN/END block)
  • Lokala variabler
  • Anrop till inbyggda SQL-funktioner som är tillgängliga
  • Anrop till andra UDF:er
  • SELECT instruktioner och referenser till tabeller, vyer och infogade tabellvärdesfunktioner

scalar_expression

Anger det skalära värde som skalärfunktionen returnerar.

select_stmt

Den enda SELECT instruktion som definierar returvärdet för en infogad tabellvärdesfunktion. För en infogad tabellvärdesfunktion finns det ingen funktionstext. tabellen är resultatuppsättningen för en enda SELECT instruktion.

BORD

Anger att returvärdet för den tabellvärdesfunktion (TVF) är en tabell. Endast konstanter och @local_variables kan skickas till TVF:er.

I infogade TVF:er (förhandsversion) definieras tabellreturvärdet via en enda SELECT instruktion. Infogade funktioner har inte associerade returvariabler.

<function_option>

I Fabric Data Warehouse stöds inte nyckelorden INLINE, ENCRYPTIONoch EXECUTE AS .

De funktionsalternativ som stöds är:

SCHEMABINDNING

Anger att funktionen är bunden till de databasobjekt som den refererar till. När SCHEMABINDING har angetts kan basobjekten inte ändras på ett sätt som påverkar funktionsdefinitionen. Själva funktionsdefinitionen måste först ändras eller tas bort för att ta bort beroenden på det objekt som ska ändras.

Bindningen av funktionen till de objekt som den refererar till tas bara bort när någon av följande åtgärder inträffar:

  • Funktionen tas bort.

  • Funktionen ändras med alter-instruktionen med alternativet SCHEMABINDING inte angivet.

En funktion kan bara bindas till ett schema om följande villkor är uppfyllda:

  • Alla användardefinierade funktioner som refereras av funktionen är också schemabundna.

  • Objekten som refereras av funktionen refereras till med hjälp av ett namn i två delar.

  • Endast inbyggda funktioner och andra UDF:er i samma databas kan refereras i brödtexten för UDF:er.

  • Användaren som körde -instruktionen CREATE FUNCTION har behörigheten REFERENSER för databasobjekten som funktionen refererar till.

Om du vill ta bort SCHEMABINDING använder du ALTER.

RETURNERAR NULL PÅ NULL-INDATA | ANROPAD FÖR NULL-INDATA

Anger attributet för OnNULLCall en skalärvärdesfunktion. Om det inte anges CALLED ON NULL INPUT är det underförstått som standard och funktionstexten körs även om NULL den skickas som ett argument.

Metodtips

  • Om en användardefinierad funktion inte skapas med schemabindning kan ändringar som görs i underliggande objekt påverka definitionen av funktionen och ge oväntade resultat när den anropas. Vi rekommenderar att du anger WITH SCHEMABINDING -satsen när du skapar funktionen. Detta säkerställer att objekten som refereras i funktionsdefinitionen inte kan ändras om inte funktionen också ändras.

  • Det går inte att skriva användardefinierade funktioner. Mer information finns i Scalar UDF-inlining.

Samverkan

Infogade användardefinierade funktioner för tabellvärde

I en infogad tabellvärdesfunktion tillåts endast en enda select-instruktion.

Skalära användardefinierade funktioner

  • Följande instruktioner är giltiga i en skalärvärdesfunktion:

    • Tilldelningssatser
    • Control-of-Flow-instruktioner utom TRY...CATCH -instruktioner
    • DECLARE instruktioner som definierar lokala datavariabler
  • Följande inbyggda funktioner stöds inte i en skalärvärdesfunktionstext:

  • Skalära UDF:er kan inte användas i en SELECT ... FROM fråga i en användartabell när:

  • Skalära UDF:er kan inte användas i en fråga när:

  • Rekursiva skalära UDF:er stöds inte.

  • En användarfråga kan misslyckas om fler än 10 UDF-anrop görs i en enda fråga.

  • I vissa kantfall förhindrar komplexiteten i användarfrågan och UDF-brödtexten inlining, i vilket fall den skalära UDF:n inte är inlindad och användarfrågan misslyckas.

  • När en skalär UDF används i ett scenario som inte stöds visas felmeddelandet "Scalar UDF execution is currently unavailable in this context."

Begränsningar

Anmärkning

Under den aktuella förhandsversionen kan begränsningar komma att ändras.

Användardefinierade funktioner kan inte användas för att utföra åtgärder som ändrar databastillståndet.

Användardefinierade funktioner kan kapslas. Det vill säga en användardefinierad funktion kan anropa en annan. Kapslingsnivån ökas när den anropade funktionen börjar att köras och minskas när den anropade funktionen slutar att köra klart. Användardefinierade funktioner i Fabric Data Warehouse kan kapslas upp till fyra nivåer när en UDF-brödtext refererar till en tabell/vy/infogad tabellvärdefunktion, eller upp till 32 nivåer på annat sätt. Om du överskrider de maximala kapslingsnivåerna misslyckas den anropande funktionskedjan.

Metainformation

I det här avsnittet visas de systemkatalogvyer som du kan använda för att returnera metadata om användardefinierade funktioner.

  • sys.sql_modules: Visar definitionen av Transact-SQL användardefinierade funktioner. Till exempel:

    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: Visar information om de parametrar som definierats i användardefinierade funktioner.

  • sys.sql_expression_dependencies: Visar de underliggande objekt som refereras av en funktion.

Behörigheter

Medlemmar i infrastrukturarbetsytans administratörs-, medlems- och deltagarroller kan skapa funktioner.

Skalär UDF-inlining

Microsoft Fabric Data Warehouse använder skalär UDF-inlining för att kompilera och köra användardefinierad kod på ett distribuerat sätt. Skalär UDF-inlinning är aktiverad som standard.

Även om skalär UDF-inlining är en prestandaoptimeringsteknik som först introducerades i Microsoft SQL Server 2019 (15.0), avgör den den uppsättning scenarier som stöds i Fabric Data Warehouse. I Fabric Data Warehouse omvandlas skalära UDF:er automatiskt till skalära uttryck eller skalära underfrågor som ersätts i den anropande frågan i stället för UDF-operatorn.

Vissa T-SQL-syntaxer gör en skalär UDF icke-linjär. Funktioner som innehåller en WHILE loop, flera RETURN instruktioner eller ett anrop till en nondeterministisk inbyggd SQL-funktion (till exempel GETUTCDATE() eller GETDATE()) kan inte infogas. Mer information finns i Skalära UDF-inliningskrav.

Kontrollera om en skalär UDF kan infogas

Katalogvyn sys.sql_modules innehåller kolumnen is_inlineable, som anger om en UDF är infogad.

Egenskapen is_inlineable härleds från att söka efter syntax i UDF-definitionen. Den skalära UDF:n är inte inlindad före kompileringstiden. Ett värde för 1 anger att UDF är inlineable, medan värdet 0 anger att den inte är infogad. Om en skalbar UDF är infogad garanterar den inte att den alltid infogas när frågan kompileras.

Fabric Data Warehouse bestämmer (per fråga) om en UDF ska infogas, beroende på den övergripande frågekomplexiteten.

Använd följande exempelfråga för att kontrollera om en skalbar UDF är infogad:

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');

Om en skalär funktion inte kan infogas i sys.sql_modules.is_inlineablekan du fortfarande köra frågan som ett fristående anrop, till exempel för att ange en variabel. Men den skalära funktionen kan inte ingå i en SELECT ... FROM fråga i en användartabell. Till exempel:

CREATE FUNCTION [dbo].[custom_SYSUTCDATETIME]()
  RETURNS datetime2(6)
  AS
  BEGIN
   RETURN SYSUTCDATETIME();
  END

Den skalära dbo.custom_SYSUTCDATETIME exempelfunktion som definieras av användaren kan inte infogas på grund av användningen av en icke-förutbestämd systemfunktion, SYSUTCDATETIME(). Det misslyckas när det används i en SELECT ... FROM fråga i en användartabell, men kommer att lyckas som ett fristående anrop, till exempel:

DECLARE @utcdate datetime2(7);
SET @utcdate = dbo.custom_SYSUTCDATETIME();
SELECT @utcdate as 'utc_date';

Exempel

A. Skapa en infogad tabellvärdesfunktion

I följande exempel skapas en infogad tabellvärdesfunktion för att returnera viktig information om moduler, som filtreras efter parametern objectType . Den innehåller ett standardvärde för att returnera alla moduler när funktionen anropas med parametern DEFAULT . I det här exemplet används några av de systemkatalogvyer som nämns i Metadata.

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

Funktionen kan sedan anropas för att returnera alla infogade tabellvärdesfunktioner (IF) med:

SELECT * FROM dbo.ModulesByType('IF'); -- SQL_INLINE_TABLE_VALUED_FUNCTION

Eller hitta alla skalärfunktioner (FN):

SELECT * FROM dbo.ModulesByType('FN'); -- SQL_SCALAR_FUNCTION

B. Kombinera resultat av en infogad tabellvärdesfunktion

I det här enkla exemplet används den tidigare skapade infogade TVF:n för att visa hur dess resultat kan kombineras med andra tabeller med korsanvändningsområden. Här väljer vi alla kolumner från båda sys.objects och resultatet av ModulesByType för alla rader som matchar i type kolumnen. Mer information om hur du använder gäller finns i FROM-satsen plus JOIN, APPLY, PIVOT (Transact-SQL).

SELECT * 
FROM sys.objects AS o
CROSS APPLY dbo.ModulesByType(o.type);
GO

C. Skapa en skalär UDF-funktion

I följande exempel skapas en linjär skalär UDF som maskerar en indatatext.

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

Du kan anropa funktionen så här:

DECLARE @input varchar(100) = '123456789'

SELECT dbo.cleanInput (@input) AS function_output;

Fler exempel på hur du kan använda skalära UDF:er i Fabric Data Warehouse:

I en SELECT instruktion:

SELECT TOP 10 
t.id, t.name, 
dbo.cleanInput (t.name) AS function_output
FROM dbo.MyTable AS t;

I en WHERE sats:

 SELECT t.id, t.name, dbo.cleanInput(t.name) AS function_output
FROM dbo.MyTable AS t
WHERE dbo.cleanInput(t.name)='myvalue'

I en JOIN sats:

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);

I en sats ORDER BY :

SELECT  t.id, t.name, dbo.cleanInput (t.name) AS function_output
FROM dbo.MyTable AS t
ORDER BY function_output;

I DML-instruktioner (datamanipuleringsspråk) som INSERT, UPDATEeller DELETE:

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';

gäller för:Azure Synapse AnalyticsAnalytics Platform System (PDW)

Skapar en användardefinierad funktion (UDF) i Azure Synapse Analytics eller Analytics Platform System (PDW). En användardefinierad funktion är en Transact-SQL rutin som accepterar parametrar, utför en åtgärd, till exempel en komplex beräkning, och returnerar resultatet av åtgärden som ett värde. Användardefinierade tabellvärdesfunktioner returnerar en tabelldatatyp.

  • I Analytics Platform System (PDW) måste returvärdet vara ett skalärt (enskilt) värde.

  • I Azure Synapse Analytics CREATE FUNCTION kan du returnera en tabell med hjälp av syntaxen för infogade tabellvärdesfunktioner (förhandsversion) eller returnera ett enda värde med hjälp av syntaxen för skalärfunktioner.

  • I serverlösa SQL-pooler i Azure Synapse Analytics CREATE FUNCTION kan du skapa infogade tabellvärdefunktioner men inte skalära funktioner.

    Använd den här instruktionen för att skapa en återanvändbar rutin som kan användas på följande sätt:

  • I Transact-SQL uttalanden som SELECT

  • I program som anropar funktionen

  • I definitionen av en annan användardefinierad funktion

  • Så här definierar du en CHECK-begränsning för en kolumn

  • Så här ersätter du en lagrad procedur

  • Använda en infogad funktion som filterpredikat för en säkerhetsprincip

Tips/Råd

Syntax i Fabric Data Warehouse finns i versionen av CREATE FUNCTION för Microsoft Fabric Data Warehouse.

Transact-SQL syntaxkonventioner

Syntax

Syntax för skalär 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 ]  
}  

Funktionssyntax för infogad tabellvärde

-- 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 [ ) ]
[ ; ]

Argumentpunkter

schema_name

Namnet på det schema som den användardefinierade funktionen tillhör.

function_name

Namnet på den användardefinierade funktionen. Funktionsnamn måste följa reglerna för identifierare och måste vara unika i databasen och för dess schema.

Anmärkning

Parenteser krävs efter funktionsnamnet även om en parameter inte har angetts.

@ parameter_name

En parameter i den användardefinierade funktionen. En eller flera parametrar kan deklareras.

En funktion kan ha högst 2 100 parametrar. Värdet för varje deklarerad parameter måste anges av användaren när funktionen körs, såvida inte ett standardvärde för parametern har definierats.

Ange ett parameternamn med hjälp av ett vidtecken (@) som det första tecknet. Parameternamnet måste överensstämma med reglerna för identifierare. Parametrarna är lokala för funktionen. Samma parameternamn kan användas i andra funktioner. Parametrar kan bara ta plats för konstanter. De kan inte användas i stället för tabellnamn, kolumnnamn eller namn på andra databasobjekt.

Anmärkning

ANSI_WARNINGS respekteras inte när du skickar parametrar i en lagrad procedur, användardefinierad funktion eller när du deklarerar och anger variabler i en batch-instruktion. Om en variabel till exempel definieras som tecken(3) och sedan anges till ett värde som är större än tre tecken trunkeras data till den definierade storleken och INSERT- eller UPDATE-instruktionen lyckas.

parameter_data_type

Parameterdatatypen. För Transact-SQL funktioner tillåts alla skalära datatyper som stöds i Azure Synapse Analytics. Datatypen tidsstämpel (rowversion) är inte en typ som stöds.

[ = standard ]

Ett standardvärde för parametern. Om ett standardvärde definieras kan funktionen köras utan att ange ett värde för den parametern.

När en parameter för funktionen har ett standardvärde måste nyckelordet DEFAULT anges när funktionen anropas för att hämta standardvärdet. Det här beteendet skiljer sig från att använda parametrar med standardvärden i lagrade procedurer där utelämnande av parametern också innebär standardvärdet.

return_data_type

Returvärdet för en skalär användardefinierad funktion. För Transact-SQL funktioner tillåts alla skalära datatyper som stöds i Azure Synapse Analytics. Datatypenrowversion-tidsstämpel/ är inte en typ som stöds. Markören och icke-skalära tabelltyper tillåts inte.

function_body

Serie med Transact-SQL-instruktioner. Function_body får inte innehålla en SELECT instruktion och kan inte referera till databasdata. Function_body kan inte referera till tabeller eller vyer. Funktionstexten kan anropa andra deterministiska funktioner men kan inte anropa nondeterministiska funktioner.

I skalära funktioner är function_body en serie Transact-SQL satser som tillsammans utvärderas till ett skalärt värde.

scalar_expression

Anger det skalära värde som skalärfunktionen returnerar.

select_stmt

Den enda SELECT instruktion som definierar returvärdet för en infogad tabellvärdesfunktion. För en infogad tabellvärdesfunktion finns det ingen funktionstext. tabellen är resultatuppsättningen för en enda SELECT instruktion.

BORD

Anger att returvärdet för den tabellvärdesfunktion (TVF) är en tabell. Endast konstanter och @local_variables kan skickas till TVF:er.

I infogade TVF:er (förhandsversion) definieras tabellreturvärdet via en enda SELECT instruktion. Infogade funktioner har inte associerade returvariabler.

<function_option>

Anger att funktionen har ett eller flera av följande alternativ.

SCHEMABINDNING

Anger att funktionen är bunden till de databasobjekt som den refererar till. När SCHEMABINDING har angetts kan basobjekten inte ändras på ett sätt som påverkar funktionsdefinitionen. Själva funktionsdefinitionen måste först ändras eller tas bort för att ta bort beroenden på det objekt som ska ändras.

Bindningen av funktionen till de objekt som den refererar till tas bara bort när någon av följande åtgärder inträffar:

  • Funktionen tas bort.

  • Funktionen ändras med alter-instruktionen med alternativet SCHEMABINDING inte angivet.

En funktion kan bara bindas till ett schema om följande villkor är uppfyllda:

  • Alla användardefinierade funktioner som refereras av funktionen är också schemabundna.

  • Funktionerna och andra UDF:er som refereras av funktionen refereras med ett endels- eller tvådelat namn.

  • Endast inbyggda funktioner och andra UDF:er i samma databas kan refereras i brödtexten för UDF:er.

  • Användaren som körde -instruktionen CREATE FUNCTION har behörigheten REFERENSER för databasobjekten som funktionen refererar till.

Om du vill ta bort SCHEMABINDING använder du ALTER.

RETURNERAR NULL PÅ NULL-INDATA | ANROPAD FÖR NULL-INDATA

Anger attributet för OnNULLCall en skalärvärdesfunktion. Om det inte anges CALLED ON NULL INPUT är det underförstått som standard och funktionstexten körs även om NULL den skickas som ett argument.

Metodtips

Om en användardefinierad funktion inte skapas med SCHEMABINDING-satsen kan ändringar som görs i underliggande objekt påverka definitionen av funktionen och ge oväntade resultat när den anropas. Vi rekommenderar att du anger WITH SCHEMABINDING -satsen när du skapar funktionen. Detta säkerställer att objekten som refereras i funktionsdefinitionen inte kan ändras om inte funktionen också ändras.

Samverkan

Följande instruktioner är giltiga i en skalärvärdesfunktion:

  • Instruktioner för tilldelning.

  • Flow-instruktioner utom TRY... CATCH-instruktioner.

  • DECLARE-instruktioner som definierar lokala datavariabler.

I en infogad tabellvärdesfunktion (förhandsversion) tillåts endast en enda select-instruktion.

Begränsningar

Användardefinierade funktioner kan inte användas för att utföra åtgärder som ändrar databastillståndet.

Användardefinierade funktioner kan kapslas. Det vill säga en användardefinierad funktion kan anropa en annan. Kapslingsnivån ökas när den anropade funktionen börjar att köras och minskas när den anropade funktionen slutar att köra klart. Om du överskrider de maximala kapslingsnivåerna orsakar det att hela kedjan av anropsfunktioner misslyckas. I Microsoft Fabric Data Warehouse kan användardefinierade funktioner kapslas upp till fem nivåer.

Objekt, inklusive funktioner, kan inte skapas i databasen för master din serverlösa SQL-pool i Azure Synapse Analytics.

Metainformation

I det här avsnittet visas de systemkatalogvyer som du kan använda för att returnera metadata om användardefinierade funktioner.

  • sys.sql_modules: Visar definitionen av Transact-SQL användardefinierade funktioner. Till exempel:

    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: Visar information om de parametrar som definierats i användardefinierade funktioner.

  • sys.sql_expression_dependencies: Visar de underliggande objekt som refereras av en funktion.

Behörigheter

Kräver CREATE FUNCTION-behörighet i databasen och ALTER-behörighet för schemat där funktionen skapas.

Exempel

A. Använda en skalvärdesbevärderad användardefinierad funktion för att ändra en datatyp

Den här enkla funktionen tar en int-datatyp som indata och returnerar en decimal (10,2) datatyp som utdata.

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';  

Anmärkning

Skalärfunktioner är inte tillgängliga i serverlösa SQL-pooler.

B. Skapa en infogad tabellvärdesfunktion

I följande exempel skapas en infogad tabellvärdesfunktion för att returnera viktig information om moduler, som filtreras efter parametern objectType . Den innehåller ett standardvärde för att returnera alla moduler när funktionen anropas med parametern DEFAULT . I det här exemplet används några av de systemkatalogvyer som nämns i Metadata.

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

Funktionen kan sedan anropas för att returnera alla visningsobjekt (V) med:

select * from dbo.ModulesByType('V');

Anmärkning

Inline table-value-funktioner är tillgängliga i serverlösa SQL-pooler, men i förhandsversion i de dedikerade SQL-poolerna.

C. Kombinera resultat av en infogad tabellvärdesfunktion

I det här enkla exemplet används den tidigare skapade infogade TVF:n för att visa hur dess resultat kan kombineras med andra tabeller med korsanvändningsområden. Här väljer vi alla kolumner från båda sys.objects och resultatet av ModulesByType för alla rader som matchar i type kolumnen. Mer information om hur du använder gäller finns i FROM-satsen plus JOIN, APPLY, PIVOT (Transact-SQL).

SELECT * 
FROM sys.objects o
CROSS APPLY dbo.ModulesByType(o.type);
GO

Anmärkning

Inline table-value-funktioner är tillgängliga i serverlösa SQL-pooler, men i förhandsversion i de dedikerade SQL-poolerna.

Nästa steg