Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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
,INSERT
ochDELETE
- 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
ochBEGIN/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
, ENCRYPTION
och 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:- UDF-brödtexten innehåller ett anrop till nondeterministisk inbyggd funktion, se Deterministiska och nondeterministiska funktioner.
- UDF-brödtexten innehåller ett gemensamt tabelluttryck (CTE)..
- UDF-brödtexten innehåller UDF-brödtext med flera instruktioner utöver sex
IF
--THEN
ELSE
block. - UDF-brödtexten innehåller en WHILE LOOP
- Det går inte att ange UDF-brödtexten på grund av andra orsaker. Mer information finns i Skalära UDF-inliningskrav.
Skalära UDF:er kan inte användas i en fråga när:
- UDF anropas direkt i en
GROUP BY
sats. - UDF anropas direkt i en
ORDER BY
-sats. - anropande fråga har ett vanligt tabelluttryck (CTE).
- UDF anropas direkt i en
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_inlineable
kan 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
, UPDATE
eller 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';
Relaterat innehåll
gäller för:Azure Synapse Analytics
Analytics 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.