Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí pro:Koncový bod analýzy SQL v Microsoft Fabric a Warehouse v Microsoft Fabric
CREATE FUNCTION vytváří inline tabulkové funkce a skalární funkce.
Poznámka:
Skalární funkce definované uživatelem jsou ve službě Fabric Data Warehouse ve verzi Preview.
Důležité
Ve službě Fabric Data Warehouse musí být skalární funkce definované uživatelem vložené pro použití s SELECT ... FROM dotazy na uživatelské tabulky, ale přesto můžete vytvářet funkce, které nejsou vložené. Skalární UDF, které nejsou inline-ovatelné, fungují v omezeném počtu scénářů. Můžete zkontrolovat , jestli se dá VDF inlinovat.
Uživatelem definovaná funkce je Transact-SQL rutina, která přijímá parametry, provádí akci, například komplexní výpočt, a vrací výsledek této akce jako hodnotu. Skalární funkce vrací skalární hodnotu, například číslo nebo řetězec. Uživatelem definované funkce s hodnotami tabulky (TVF) vracejí tabulku.
Použijte CREATE FUNCTION k vytvoření opakovaně použitelné T-SQL rutiny, kterou můžete využít těmito způsoby:
- V Transact-SQL příkazy, jako je
SELECT - V Transact-SQL příkazy pro manipulaci s daty (DML), jako
UPDATEje ,INSERTaDELETE - V aplikacích, které funkci volají
- V definici další uživatelem definované funkce
- Nahrazení uložené procedury
Můžete nastavit CREATE OR ALTER FUNCTION vytvoření nové funkce, pokud pod tímto názvem neexistuje, nebo změnit existující funkci v jednom příkazu.
Syntaxe
Syntaxe skalárních funkcí
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 ]
}
Syntaxe vložené funkce s hodnotou tabulky
CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] parameter_data_type
[ = default ] }
[ ,...n ]
]
)
RETURNS TABLE
[ WITH SCHEMABINDING ]
[ AS ]
RETURN [ ( ] select_stmt [ ) ]
[ ; ]
Argumenty
schema_name
Název schématu, do kterého patří uživatelem definovaná funkce.
function_name
Název uživatelem definované funkce. Názvy funkcí musí dodržovat pravidla identifikátorů a být jedinečné v databázi a jejím schématu.
Poznámka:
Musíte zahrnout závorky za název funkce, i když parametr nespecifikujete.
@ parameter_name
Parametr v uživatelem definované funkci. Můžete deklarovat jeden nebo více parametrů.
Funkce může mít až 2 100 parametrů. Když uživatel nebo aplikace volá funkci, musí být zadán hodnota každého deklarovaného parametru, pokud není definován výchozí parametr.
Zadejte název parametru pomocí znaku at (@) jako prvního znaku. Název parametru musí dodržovat pravidla pro identifikátory. Parametry jsou lokální pro funkci; Stejné názvy parametrů můžete použít i v jiných funkcích. Parametry mohou nahradit pouze konstanty; Nelze je použít místo názvů tabulek, sloupců nebo jiných databázových objektů.
Poznámka:
ANSI_WARNINGS se nedodržuje při předávání parametrů v uložené proceduře, uživatelsky definované funkci nebo při deklaraci a nastavení proměnných v dávkovém příkazu. Například pokud definujete proměnnou jako char(3) a pak ji nastavíte na hodnotu větší než tři znaky, data se zkrátí na definovanou velikost a SQL příkaz uspěje.
parameter_data_type
Datový typ parametru. Pro Transact-SQL funkce jsou povoleny všechny skalární datové typy .
[ = výchozí ]
Výchozí hodnota parametru. Pokud definujete výchozí hodnotu, můžete funkci spustit bez zadání hodnoty pro daný parametr.
Když má parametr funkce výchozí hodnotu, musíte při volání funkce zadat klíčové slovo DEFAULT , abyste získali výchozí hodnotu. Toto chování se liší od použití parametrů s výchozími hodnotami v uložených procedurách, ve kterých vynechání parametru znamená také výchozí hodnotu.
return_data_type
Návratová hodnota skalární uživatelem definované funkce.
Pro funkce v Datovém skladu infrastruktury jsou všechny datové typy povoleny s výjimkoučasového razítka/. Neskalární typy jako tabulky nejsou povoleny.
function_body
Řada příkazů Transact-SQL.
Ve skalárních funkcích je function_body řada příkazů Transact-SQL, které se společně vyhodnotí jako skalární hodnota, která může zahrnovat:
- Výraz s jedním příkazem
- Výrazy s více příkazy (
IF/THEN/ELSEaBEGIN/ENDbloky) - Místní proměnné
- Dostupná volání předdefinovaných funkcí SQL
- Volání jiných uživatelem definovaných funkcí
-
SELECTpříkazy a odkazy na tabulky, zobrazení a vložené funkce s hodnotami tabulky - Příkazy řídicího toku (
WHILEsmyčky,RETURNS)
scalar_expression
Určuje skalární hodnotu, kterou skalární funkce vrátí.
select_stmt
Jediný SELECT příkaz, který definuje návratovou hodnotu vložené funkce s hodnotou tabulky. Pro inline tabulkově hodnotovou funkci neexistuje tělo funkce; tabulka je výsledná množina jednoho SELECT příkazu.
TABLE
Určuje, že návratová hodnota funkce hodnotící tabulku (TVF) je tabulka. Konstanty a @local_variables můžete předávat jen TVF.
V inline TVF (náhled) definujete TABLE návratovou hodnotu pomocí jednoho SELECT příkazu. Vložené funkce nemají přiřazené návratové proměnné.
<function_option>
V Fabric Data Warehouse nejsou podporovány INLINE, ENCRYPTION, a EXECUTE AS klíčová slova.
Podporované možnosti funkcí zahrnují:
SCHEMABINDING
Určuje, že funkce je svázána s databázovými objekty, na které odkazuje. Když určíte SCHEMABINDING, nemůžete upravovat podkladové objekty (například pohled nebo tabulku) tak, aby to ovlivnilo definici funkce. Nejprve musíte upravit nebo zrušit definici funkce, abyste odstranili závislosti na objektu, který chcete upravit.
Vazba funkce na objekty, na které odkazuje, je odstraněna pouze v případě, že dojde k jedné z následujících akcí:
Ty tu funkci necháš.
Použijete příkaz funkce a odstraníte
ALTERSCHEMABINDINGtuto možnost.
Funkci můžete schema vázat pouze tehdy, pokud jsou splněny následující podmínky:
Jakékoliv uživatelsky definované funkce, na které funkce odkazuje, jsou také vázané na schéma.
Funkce odkazuje na objekty pomocí dvoudílného názvu.
V těle UDF můžete odkazovat pouze na vestavěné funkce a další UDF ve stejné databázi.
Uživatel, který příkaz vykoná,
CREATE FUNCTIONmá oprávnění ODKAZOVAT na databázové objekty, na které funkce odkazuje.
Chcete-li odebrat SCHEMABINDING, použijte ALTER.
VRÁTÍ HODNOTU NULL PRO VSTUP NULL | VOLÁNA PŘI VSTUPU S HODNOTOU NULL
Určuje OnNULLCall atribut skalární-hodnotné funkce. Pokud tento atribut nespecifikujete, CALLED ON NULL INPUT je automaticky implikován a tělo funkce se vykoná, i když NULL je předáno jako argument.
Osvědčené postupy
Pokud nevytvoříte uživatelsky definovanou funkci se schemabindingem, změny základních objektů mohou ovlivnit definici funkce a způsobit neočekávané výsledky při jejím vyvolání. Když určíte
WITH SCHEMABINDING, kdy funkci vytvoříte, zajistíte, že pozdější změny základních objektů nemohou změnit ani narušit chování funkce.Napište uživatelsky definované funkce tak, aby byly inline-ovatelné. Pro více informací viz Inlining of scalar UDF.
Interoperabilita
Vložené funkce definované uživatelem s hodnotou tabulky
Funkce s tabulkovými hodnotami v textu přijímá pouze jeden SELECT příkaz.
Skalární uživatelem definované funkce
Následující příkazy jsou platné ve skalární-hodnotové funkci:
- Příkazy přiřazení.
- Příkazy control-of-Flow kromě
TRY...CATCHa příkazůGO..TO. -
DECLAREPříkazy definující lokální datové proměnné. - Odkazy na tabulky/pohledy/iTVF/jiné skalární UDF.
V těle skalární funkce s hodnotou nejsou podporované následující předdefinované funkce:
Omezení
Poznámka:
Během aktuální verze Preview se omezení můžou změnit.
Nemůžete použít uživatelsky definované funkce k provádění akcí, které mění stav databáze.
Můžete vnořit uživatelem definované funkce. To znamená, že jedna uživatelem definovaná funkce může volat jinou. Úroveň vnoření se zvyšuje při zahájení vykonávání volané funkce a snižuje se, když volaná funkce dokončí vykonání. V Fabric Data Warehouse můžete vnořit uživatelem definované funkce až do čtyř úrovní, když tělo UDF odkazuje na tabulku, pohled nebo inline tabulkovou funkci, nebo až 32 úrovní jinak. Pokud překročíte maximální úroveň vnoření, řetězec volacích funkcí selže.
Skalární funkce definované uživatelem se nedají použít v dotazu na uživatelskou tabulku,
SELECT ... FROMkdyž:- Tělo UDF obsahuje volání nedeterministické vestavěné funkce (například
GETDATE()), viz Deterministické a nedeterministické funkce. - Tělo UDF obsahuje
BREAKneboCONTINUEpříkaz. - Existuje rekurzivní skalární UDF volání.
- Tělo UDF obsahuje volání nedeterministické vestavěné funkce (například
Skalární UDF nelze použít ve všech dotazových tvarech, jako jsou CTE a
GROUP BYkdyž:- Skalární tělo UDF obsahuje odkazy na tabulky/pohledy/iTVF/jiné skalární UDF.
- Skalární UDF obsahuje kterýkoli z těchto datových typů jako vstupní parametr, lokální proměnnou nebo návratový datový typ: varchar(max),nvarchar(max),varbinary(max),binary(max).
- Skalární tělo UDF obsahuje volání funkcí AI.
- V uvedených scénářích platí obecné požadavky na inlining pro skalární UDF.
Pokud skalární UDF obsahuje některou z následujících funkcí, může uživatelský dotaz selhat, pokud je v jednom dotazu provedeno více než 10 UDF volání:
- Skalární tělo UDF obsahuje odkazy na tabulky/pohledy/iTVF/jiné skalární UDF.
- Skalární UDF obsahuje kterýkoli z těchto datových typů jako vstupní parametr, lokální proměnnou nebo návratový datový typ: varchar(max),nvarchar(max),varbinary(max),binary(max).
- Skalární tělo UDF obsahuje volání AI funkcí.
Když je v jakémkoli nepodporovaném scénáři použit skalární UDF, při vykonávání dotazu se objeví chybová zpráva "
Scalar UDF execution is currently unavailable in this context.".
Metadatové informace
Tato část obsahuje seznam zobrazení systémového katalogu, která můžete použít k vrácení metadat o uživatelem definovaných funkcích.
sys.sql_modules: Zobrazuje definici Transact-SQL uživatelsky definovaných funkcí a informace o možnosti propojení. Například:
SELECT SCHEMA_NAME(o.schema_id) AS SchemaName, o.name AS FunctionName, m.definition AS FunctionDefinition, m.is_inlineable AS Inlineable, m.inline_eligibility_mask AS InlineEligibilityMask FROM sys.objects o JOIN sys.sql_modules m ON o.object_id = m.object_id WHERE o.type = 'FN';sys.parameters: Zobrazí informace o parametrech definovaných v uživatelem definovaných funkcích.
sys.sql_expression_dependencies: Zobrazí základní objekty odkazované funkcí.
Povolení
Funkce můžou vytvářet členové role správce pracovního prostoru Infrastruktury, člena a přispěvatele.
Inlining skalárního UDF
Microsoft Fabric Data Warehouse používá různé techniky inlinování pro kompilaci a spuštění uživatelsky definovaného kódu distribuovaným způsobem.
Inlining skalárního UDF je ve výchozím nastavení povolen.
Některá syntaxe T-SQL způsobí, že skalární UDF není vložený. Například funkce, které obsahují kombinaci smyčky WHILE a odkazují na tabulku uvnitř těla UDF, nelze inlineovat.
Kontrola, jestli je možné inlinovat skalární uživatelem definovanou uživatelem
Zobrazení sys.sql_modules katalogu obsahuje sloupec is_inlineable, který označuje, jestli je definovaná uživatelem vložená. Vlastnost is_inlineable pochází z kontroly syntaxe uvnitř definice UDF. Skalární UDF není před kompilací inline.
Vlastnost inline_eligibility_mask vysvětluje, jaký typ inlining je pro UDF použitelný.
- Hodnota znamená
0, že UDF není inlineibilní. - Hodnota označuje
1, že UDF je způsobilý pro skalární inlining. - Hodnota znamená
2, že UDF je způsobilý pro inlining pomocí expression block. - Hodnota znamená
3, že UDF je způsobilý pro obě inlining techniky.
Pokud je skalární UDF inlineovatelný, nezaručuje to, že je vždy inline-ovaný při kompilaci dotazu.
Fabric Data Warehouse rozhoduje (podle dotazu), kterou techniku inlindingu použije.
Pomocí následujícího ukázkového dotazu zkontrolujte, jestli je skalární UDF vložený:
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');
Pokud skalární funkce není inline-operátorná v sys.sql_modules.is_inlineable, můžete dotaz stále spustit jako samostatné volání, například pro nastavení proměnné. Ale skalární funkce nemůže být součástí dotazu SELECT ... FROM v uživatelské tabulce. Například:
CREATE FUNCTION [dbo].[custom_SYSUTCDATETIME]()
RETURNS datetime2(6)
AS
BEGIN
RETURN SYSUTCDATETIME();
END
Ukázková dbo.custom_SYSUTCDATETIME skalární uživatelsky definovaná funkce není inline-oběhutelná kvůli použití nedeterminantní systémové funkce, SYSUTCDATETIME(). Selže při použití v dotazu SELECT ... FROM na uživatelské tabulce, ale jako samostatné volání uspěje. Například:
DECLARE @utcdate datetime2(7);
SET @utcdate = dbo.custom_SYSUTCDATETIME();
SELECT @utcdate as 'utc_date';
Příklady
A. Vytvoření vložené funkce s hodnotou tabulky
Následující příklad vytváří inline tabulkovou funkci, která vrací klíčové informace o modulech a filtruje podle parametru objectType . Obsahuje výchozí hodnotu, která vrací všechny moduly při volání funkce s parametrem DEFAULT . Tento příklad využívá některé pohledy z katalogu systému zmíněné v metadatech.
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
Zavolejte funkci, která vrací všechny inline tabulkové funkce (IF):
SELECT * FROM dbo.ModulesByType('IF'); -- SQL_INLINE_TABLE_VALUED_FUNCTION
Nebo vyhledejte všechny skalární funkce (FN):
SELECT * FROM dbo.ModulesByType('FN'); -- SQL_SCALAR_FUNCTION
B. Kombinování výsledků vložené funkce s hodnotou tabulky
Tento jednoduchý příklad využívá dříve vytvořený inline TVF k demonstraci, jak lze jeho výsledky kombinovat s dalšími tabulkami pomocí .CROSS APPLY Zde vyberete všechny sloupce z obou sys.objects a výsledky pro ModulesByType všechny řádky, které se shodují ve sloupci type . Pro více informací o použití APPLYviz klauzule FROM plus JOIN, APPLY, PIVOT (Transact-SQL).
SELECT *
FROM sys.objects AS o
CROSS APPLY dbo.ModulesByType(o.type);
GO
C. Vytvoření skalární funkce definované uživatelem
Následující příklad vytvoří vložený skalární UDF, který maskuje vstupní text.
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
Funkci můžete volat takto:
DECLARE @input varchar(100) = '123456789'
SELECT dbo.cleanInput (@input) AS function_output;
Další příklady použití skalárních funkcí v datovém skladu Fabric:
SELECT V příkazu:
SELECT TOP 10
t.id, t.name,
dbo.cleanInput (t.name) AS function_output
FROM dbo.MyTable AS t;
V klauzuli WHERE :
SELECT t.id, t.name, dbo.cleanInput(t.name) AS function_output
FROM dbo.MyTable AS t
WHERE dbo.cleanInput(t.name)='myvalue'
V klauzuli JOIN :
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);
V klauzuli ORDER BY :
SELECT t.id, t.name, dbo.cleanInput (t.name) AS function_output
FROM dbo.MyTable AS t
ORDER BY function_output;
V příkazech jazyka DML (Data Manipulat Language), jako je INSERT, UPDATEnebo 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';
Související obsah
Vytvoří uživatelem definovanou funkci (UDF) ve službě Azure Synapse Analytics nebo PdW (Analytics Platform System). Uživatelem definovaná funkce je rutina Transact-SQL, která přijímá parametry, provádí akci, například složitý výpočet, a vrací výsledek této akce jako hodnotu. Uživatelem definované funkce s hodnotami tabulky (TVF) vracejí datový typ tabulky.
Návod
Pro syntaxi v Fabric Data Warehouse viz verze for CREATE FUNCTION Fabric Data Warehouse.
V systému PDW (Analytics Platform System) musí být návratová hodnota skalární (jednoduchá).
Ve službě Azure Synapse Analytics
CREATE FUNCTIONmůže vrátit tabulku pomocí syntaxe pro vložené funkce s hodnotami tabulky (Preview) nebo může vrátit jednu hodnotu pomocí syntaxe skalárních funkcí.V bezserverových fondech SQL ve službě Azure Synapse Analytics můžete vytvářet vložené funkce pro hodnoty tabulky,
CREATE FUNCTIONale ne skalární funkce.Použijte toto tvrzení k vytvoření opakovaně použitelné rutiny, kterou můžete využít těmito způsoby:
V Transact-SQL příkazy, jako je
SELECTV aplikacích, které volají funkci
V definici další uživatelem definované funkce
Definování omezení CHECK u sloupce
Nahrazení uložené procedury
Použití vložené funkce jako predikátu filtru pro zásadu zabezpečení
Syntaxe
Syntaxe skalárních funkcí
-- 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 ]
}
Syntaxe vložené funkce s hodnotou tabulky
-- 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 [ ) ]
[ ; ]
Argumenty
schema_name
Název schématu, do kterého patří uživatelem definovaná funkce.
function_name
Název uživatelem definované funkce. Názvy funkcí musí dodržovat pravidla identifikátorů a být jedinečné v databázi a jejím schématu.
Poznámka:
Musíte zahrnout závorky za název funkce, i když parametr nespecifikujete.
@ parameter_name
Parametr v uživatelem definované funkci. Můžete deklarovat jeden nebo více parametrů.
Funkce může mít až 2 100 parametrů. Když uživatel nebo aplikace volá funkci, musí být zadán hodnota každého deklarovaného parametru, pokud není definován výchozí parametr.
Zadejte název parametru pomocí znaku at (@) jako prvního znaku. Název parametru musí dodržovat pravidla pro identifikátory. Parametry jsou lokální pro funkci; Stejné názvy parametrů můžete použít i v jiných funkcích. Parametry mohou nahradit pouze konstanty; Nelze je použít místo názvů tabulek, sloupců nebo jiných databázových objektů.
Poznámka:
ANSI_WARNINGS se nedodržuje při předávání parametrů v uložené proceduře, uživatelsky definované funkci nebo při deklaraci a nastavení proměnných v dávkovém příkazu. Například pokud definujete proměnnou jako char(3) a pak ji nastavíte na hodnotu větší než tři znaky, data se zkrátí na definovanou velikost a INSERT příkaz or UPDATE uspěje.
parameter_data_type
Datový typ parametru. Pro Transact-SQL funkce jsou povolené všechny skalární datové typy podporované ve službě Azure Synapse Analytics. Datový typ s časovým razítkem (verze řádku) není podporovaným typem.
[ = výchozí ]
Výchozí hodnota parametru. Pokud definujete výchozí hodnotu, můžete funkci spustit bez zadání hodnoty pro daný parametr.
Když má parametr funkce výchozí hodnotu, musíte při volání funkce zadat klíčové slovo DEFAULT , abyste získali výchozí hodnotu. Toto chování se liší od použití parametrů s výchozími hodnotami v uložených procedurách, ve kterých vynechání parametru znamená také výchozí hodnotu.
return_data_type
Návratová hodnota skalární uživatelem definované funkce. Pro Transact-SQL funkce jsou povolené všechny skalární datové typy podporované ve službě Azure Synapse Analytics. Datový typ datovéhorazítka/ není podporovaným typem. Kurzor a tabulka typu bez skaláru nejsou povoleny.
function_body
Řada příkazů Transact-SQL
function_body nemůže obsahovat SELECT příkaz a nemůže odkazovat na databázová data.
function_body nemůže odkazovat na tabulky ani pohledy. Těleso funkce může volat jiné deterministické funkce, ale nemůže volat nedeterministické funkce.
Ve skalárních funkcích je function_body řada Transact-SQL příkazů, které jsou společně vyhodnoceny jako skalární hodnota.
scalar_expression
Určuje skalární hodnotu, kterou skalární funkce vrátí.
select_stmt
Jediný SELECT příkaz, který definuje návratovou hodnotu vložené funkce s hodnotou tabulky. Pro inline tabulkově hodnotovou funkci neexistuje tělo funkce; tabulka je výsledná množina jednoho SELECT příkazu.
TABLE
Určuje, že návratová hodnota funkce hodnotící tabulku (TVF) je tabulka. Konstanty a @local_variables můžete předávat jen TVF.
V inline TVF (náhled) definujete TABLE návratovou hodnotu pomocí jednoho SELECT příkazu. Vložené funkce nemají přiřazené návratové proměnné.
<function_option>
Určuje, že funkce má jednu nebo více z následujících možností.
SCHEMABINDING
Určuje, že funkce je svázána s databázovými objekty, na které odkazuje. Když určíte SCHEMABINDING, nemůžete upravovat podkladové objekty (například pohled nebo tabulku) tak, aby to ovlivnilo definici funkce. Nejprve musíte upravit nebo zrušit definici funkce, abyste odstranili závislosti na objektu, který chcete upravit.
Vazba funkce na objekty, na které odkazuje, je odstraněna pouze v případě, že dojde k jedné z následujících akcí:
Ty tu funkci necháš.
Použijete příkaz funkce a odstraníte
ALTERSCHEMABINDINGtuto možnost.
Funkci můžete schema vázat pouze tehdy, pokud jsou splněny následující podmínky:
Jakékoliv uživatelsky definované funkce, na které funkce odkazuje, jsou také vázané na schéma.
Reference funkcí používají názvy jednodílné nebo dvoudílné.
V těle UDF můžete odkazovat pouze na vestavěné funkce a další UDF ve stejné databázi.
Uživatel, který příkaz vykoná,
CREATE FUNCTIONmá oprávnění ODKAZOVAT na databázové objekty, na které funkce odkazuje.
Chcete-li odebrat SCHEMABINDING, použijte ALTER.
VRÁTÍ HODNOTU NULL PRO VSTUP NULL | VOLÁNA PŘI VSTUPU S HODNOTOU NULL
Určuje OnNULLCall atribut skalární-hodnotné funkce. Pokud tento atribut nespecifikujete, CALLED ON NULL INPUT je automaticky implikován a tělo funkce se vykoná, i když NULL je předáno jako argument.
Osvědčené postupy
Pokud nevytvoříte uživatelsky definovanou funkci s klauzulí SCHEMABINDING, změny základních objektů mohou ovlivnit definici funkce a způsobit neočekávané výsledky při jejím vyvolání. Specifikujte klauzuli WITH SCHEMABINDING při vytváření funkce. Tato klauzule zajišťuje, že objekty odkazované v definici funkce nemůžete upravovat, pokud nezměníte i funkci.
Interoperabilita
Následující příkazy jsou platné ve skalární-hodnotové funkci:
Příkazy přiřazení.
Příkazy pro řízení toku, kromě TRY... CATCH výroky.
Příkazy DECLARE, které definují lokální datové proměnné.
V inline tabulové funkci (náhledu) můžete použít pouze jeden příkaz select.
Omezení
Nemůžete použít uživatelsky definované funkce k provádění akcí, které mění stav databáze.
Můžete vnořit uživatelem definované funkce. Jedna uživatelsky definovaná funkce může volat jinou. Úroveň vnoření se zvyšuje při zahájení vykonávání volané funkce a snižuje se, když volaná funkce dokončí vykonání. Pokud překročíte maximální úrovně vnoření, celý řetězec volacích funkcí selže.
Nemůžete vytvářet objekty, včetně funkcí, v databázi master vašeho serverless SQL poolu v Azure Synapse Analytics.
Metadatové informace
Tato část obsahuje seznam zobrazení systémového katalogu, která můžete použít k vrácení metadat o uživatelem definovaných funkcích.
sys.sql_modules: Zobrazí definici Transact-SQL uživatelem definovaných funkcí. Například:
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: Zobrazí informace o parametrech definovaných v uživatelem definovaných funkcích.
sys.sql_expression_dependencies: Zobrazí základní objekty odkazované funkcí.
Povolení
Vyžaduje CREATE FUNCTION oprávnění v databázi a ALTER povolení ke schématu, ve kterém je funkce vytvářena.
Příklady
A. Změna datového typu pomocí skalární funkce definované uživatelem
Tato jednoduchá funkce přijímá int datový typ jako vstup a vrací desetinný (10,2) datový typ jako výstup.
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';
Poznámka:
Skalární funkce nejsou dostupné v serverless SQL poolech.
B. Vytvoření vložené funkce s hodnotou tabulky
Následující příklad vytváří inline tabulkovou funkci, která vrací klíčové informace o modulech a filtruje podle parametru objectType . Obsahuje výchozí hodnotu, která vrací všechny moduly při volání funkce s parametrem DEFAULT . Tento příklad využívá některé pohledy z katalogu systému zmíněné v metadatech.
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
Můžete volat funkci, která vrací všechny objekty view (V) s:
select * from dbo.ModulesByType('V');
Poznámka:
Funkce s tabulkovou hodnotou jsou dostupné v serverless SQL poolech, ale v náhledu v dedikovaných SQL poolech.
C. Kombinování výsledků vložené funkce s hodnotou tabulky
Tento jednoduchý příklad využívá dříve vytvořený inline TVF k demonstraci, jak lze jeho výsledky kombinovat s dalšími tabulkami pomocí .CROSS APPLY V tomto příkladu vyberete všechny sloupce z obou sys.objects a výsledky pro ModulesByType všechny řádky, které odpovídají sloupci type . Pro více informací o použití APPLYviz klauzule FROM plus JOIN, APPLY, PIVOT (Transact-SQL).
SELECT *
FROM sys.objects o
CROSS APPLY dbo.ModulesByType(o.type);
GO
Poznámka:
Funkce s tabulkovou hodnotou jsou dostupné v serverless SQL poolech, ale v náhledu v dedikovaných SQL poolech.