Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik:SQL Analytics-végpont a Microsoft Fabricben és a Microsoft Fabric warehouse-ban
CREATE FUNCTION inline táblázatértékű függvényeket és skaláris függvényeket hoz létre.
Megjegyzés:
A skaláris UDF-ek és külső UDF-ek előnézeti funkciók Fabric Data Warehouse-ben.
Ez a cikk a Fabric Data Warehouse és az Fabric elemek SQL analitikai végpontjára vonatkozik. Más platformokról lásd CREATE FUNCTION (Transact-SQL).
A felhasználó által definiált függvény egy Transact-SQL rutin, amely paramétereket fogad el, végrehajt egy olyan műveletet, mint egy összetett számítás, és az adott művelet eredményét értékként adja vissza. A skaláris függvények skaláris értéket adnak vissza, például számot vagy sztringet. A felhasználó által definiált táblaértékű függvények (TVF-ek) egy táblát ad vissza.
Használd CREATE FUNCTION egy újrahasználható T-SQL rutin létrehozására, amelyet a következőképpen használhatsz:
- Transact-SQL olyan állítások, mint
SELECT. - Transact-SQL-ben adatmanipulációs állítások (DML), mint például
UPDATE,INSERT, ésDELETE. - Az alkalmazásokban, amelyek a függvényt hívják.
- Egy másik felhasználó által definiált függvény definíciójában.
- Egy tárolt eljárás helyettesítésére.
Határozd CREATE OR ALTER FUNCTION meg, hogy létrehozz egy új függvényt, ha nincs ilyen néven, vagy módosítsd egy meglévő függvényt egyetlen állításban.
Transact-SQL szintaxis konvenciók
Szemantika
Skaláris függvény szintaxisa
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>::=
{
[ INLINE = AUTO ]
| [ SCHEMABINDING ]
| [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]
}
Beágyazott táblaértékű függvény szintaxisa
CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] parameter_data_type
[ = default ] }
[ ,...n ]
]
)
RETURNS TABLE
[ WITH SCHEMABINDING ]
[ AS ]
RETURN [ ( ] select_stmt [ ) ]
[ ; ]
Külső függvényszintaxis
A külső UDF egy olyan függvény, amely egy külső Fabric Felhasználói Adat Függvényre hivatkozik.
CREATE FUNCTION [ schema_name. ] function_name
[ RETURNS return_data_type ]
AS EXTERNAL FUNCTION exteral_function_set_name.external_function_name
[ ; ]
Megjegyzés:
A külső UDF-ek előnézeti funkció a Fabric Data Warehouse-ben.
Az CREATE FUNCTION utasítás automatikusan a visszacsatolási típust, paramétereket és paramétertípusokat a hivatkozott külső Fabric User Data Function definíciójából vezeti le. Ha a külső Fabric User Data Function aláírása megváltozik, újra kell létrehoznod a függvényt, hogy szinkronizáld a definícióját a frissített aláírással.
Érvek
schema_name
Annak a sémának a neve, amelyhez a felhasználó által definiált függvény tartozik.
function_name
A felhasználó által definiált függvény neve. A függvényneveknek követniük kell az azonosítók szabályait, és egyedinek kell lenniük az adatbázisban és annak sémájában.
A függvénynév után zárójeleket kell beilleszteni, még akkor is, ha nem jelölsz meg paramétert.
@ parameter_name
A felhasználó által definiált függvény paramétere. Be lehet jelenteni egy vagy több paramétert.
Egy függvénynek legfeljebb 2100 paramétere lehet. Amikor egy felhasználó vagy alkalmazás függvényt hív, minden deklarált paraméterhez megadnod kell az értéket, hacsak nem definiálsz alapértelmezett értéket a paraméterhez.
Adjon meg egy paraméternevet úgy, hogy első karakterként egy at sign (@) karaktert használ. A paraméter nevének követnie kell az azonosítók szabályait. A paraméterek lokálisak a függvényre; Ugyanazokat a paraméterneveket más függvényekben is használhatod. A paraméterek csak az állandókat helyettesíthetik; nem használhatók táblanevek, oszlopnevek vagy más adatbázis-objektumok nevei helyett.
ANSI_WARNINGS nem teljesül, ha paramétereket ad át egy tárolt eljárásban, felhasználó által definiált függvényben, vagy ha változókat deklarál és állít be egy batch utasításban. Például, ha egy változót char(3)-ként definiálsz, majd három karakternél nagyobb értékre állítod, az adat a megadott méretre rövidítik, és az SQL utasítás sikeres lesz.
parameter_data_type
A paraméter adattípusa. Transact-SQL függvények esetében minden támogatott skaláris adattípus engedélyezett.
[ = alapértelmezett ]
A paraméter alapértelmezett értéke. Ha alapértelmezett értéket definiálsz, akkor a függvényt úgy is végrehajthatod, hogy megadnád az adott paraméterhez szükséges értéket.
Ha a függvény paraméterének alapértelmezett értéke van, DEFAULT akkor a kulcsszót kell megadnod, amikor a függvényt hívod az alapértelmezett érték eléréséhez. Ez a viselkedés eltér az alapértelmezett értékekkel rendelkező paraméterek tárolt eljárásokban való használatától, amelyekben a paraméter kihagyása az alapértelmezett értéket is magában foglalja.
return_data_type
Egy skaláris, felhasználó által definiált függvény visszatérési értéke.
A Fabric Data Warehouse függvényekhez minden adattípust használhatsz, kivéve a sorverziós/időbélyeget. A nonskaláris típusok, mint például a táblázat , nem engedélyezettek.
Külső UDF-ek (előnézet) esetén a RETURNS záradék opcionális. Ha kihagyják, a visszaküldési típus automatikusan következik a hivatkozott Fabric User Data Function visszatérési típusából. Megadhatod a RETURNS kizárást, amely szükség esetén felülírja az inferred return típust.
function_body
Transact-SQL utasítások sorozata.
A skaláris függvényekben a function_body Transact-SQL utasítások sorozata, amelyek együttesen skaláris értékre értékelnek, amelyek a következők lehetnek:
- Egyutas kifejezés
- Többutas kifejezések (
IF/THEN/ELSEésBEGIN/ENDblokkok) - Helyi változók
- Elérhető beépített SQL-függvények hívása
- Hívások más UDF-ekhez
-
SELECTutasítások, valamint táblákra, nézetekre és beágyazott táblázatértékelt függvényekre mutató hivatkozások - Vezérlő áramlási utasítások (
WHILEhurkok,RETURNS)
Külső UDF-eknél (Preview) nem lehet megadni a function_body, mert a funkció megvalósítása külsőleg definiálva van a hozzá tartozó Fabric User Data Function (Felhasználó) függvényben. Az adatbázis csak a függvény metaadatait tárolja; a futtatható logika a külső függvénydefinícióban található.
scalar_expression
Megadja a skaláris függvény által visszaadott skaláris értéket.
select_stmt
SELECT Egyetlen utasítás, amely egy beágyazott táblaértékű függvény visszatérési értékét határozza meg. Egy besoros táblázatértékű függvény esetén nincs függvénytest; a tábla egyetlen SELECT állítás eredményhalmaza.
TABLE
Megadja, hogy a táblaértékű függvény (TVF) visszatérési értéke tábla. Csak állandókat és @local_variables-t tudsz átadni TVF-eknek.
Az inline TVF-ekben (előnézet) egyetlen állítással definiáljuk a TABLE visszahozási értéket SELECT . A beágyazott függvények nem rendelkeznek társított visszatérési változókkal.
<function_option>
Fabric Data Warehouse-ben a ENCRYPTION és EXECUTE AS kulcsszavak nem támogatottak.
A támogatott funkciók a következők:
INLINE = AUTO
Megadja, hogy egy skaláris, felhasználó által definiált függvény létrehozható-e vagy módosítható-e az inlin követelményektől függetlenül. A INLINE záradék nem kötelező. Egy inlineable skaláris UDF esetén a meghatározás INLINE = AUTO nem változtatja meg az inlinebilitást vagy a végrehajtási viselkedést.
SÉMAKÖTÉS
Megadja, hogy a függvény az általa hivatkozott adatbázis-objektumokhoz legyen kötve. Ha megadod SCHEMABINDING, nem módosíthatod az alapul szolgáló objektumokat (például egy nézetet vagy táblát) úgy, hogy az befolyásolja a függvény definícióját. Először módosítani vagy el kell hagyni a függvénydefiníciót, hogy eltávolítsuk a függőségeket a módosítani kívánt objektumról.
A függvény hivatkozási objektumokhoz való kötése csak akkor törlődik, ha az alábbi műveletek valamelyike történik:
Kihagyod a funkciót.
Te
ALTERadd a függvényutasítást, és távolítod el azSCHEMABINDINGopciót.
Csak akkor lehet sémához kötni egy függvényt, ha a következő feltételek érvényesek:
Bármely felhasználó által definiált függvény, amelyre a függvény hivatkozik, szintén sémához kötött.
A függvény két részes név használatával hivatkozik objektumokra.
Az UDF-ek testén belül csak a beépített függvényekre és más UDF-ekre lehet hivatkozni ugyanabban az adatbázisban.
A felhasználó végrehajtja
CREATE FUNCTIONaz utasítást REFERENCES jogosultsággal rendelkezik azokon az adatbázisobjektumoknál, amelyekre a függvény hivatkozik.
A SCHEMABINDING eltávolításához használja a következőt ALTER: .
NULL ÉRTÉKET AD VISSZA NULL BEMENETRE | NULL BEMENETRE HÍVOTT
OnNULLCall Egy skaláris értékű függvény attribútumát adja meg. Ha nem határozod meg ezt az attribútumot, CALLED ON NULL INPUT alapértelmezettként implicit van, és a függvénytest akkor is fut, ha NULL argumentumként adják át.
KÜLSŐ MINŐSÉGBEN FUNCTION
Hivatkozik egy Fabric User Data Function (UDF) funkcióra. Amikor a függvényt meghívják, a végrehajtást a hivatkozott Fabric User Data Function felé delegálják, ahol a logikát végrehajtják, és az eredmény visszakerül a T-SQL hívóhoz.
Ez a záradék a következő paramétereket fogadja el:
- Funkciókészlet neve: Az a függvényhalmaz neve, amely tartalmazza a Fabric User Data Függvényt. Minden Fabric felhasználói adat függvénynek egy függvényhalmazhoz kell tartoznia.
- Funkció neve: A Fabric User Data Function neve, amire hivatkozunk.
Az alábbi szintaxis mutatja, hogyan vannak ezek a paraméterek:
CREATE FUNCTION [schema_name.]function_name
AS EXTERNAL FUNCTION <<functionset_name>>.<<python_function_name>>
Mivel a függvény távolról van végrehajtva, egy külső függvény meghívása általában nagyobb késleltetést okoz, mint egy natív T-SQL felhasználó által definiált függvény futtatása. Külső függvényeket használjunk, amikor a szükséges üzleti logika Fabric-ben van megvalósítva, és nem fejezhető ki közvetlenül T-SQL-ben.
Az CREATE FUNCTION utasítás automatikusan a visszacsatolási típust, paramétereket és paramétertípusokat a hivatkozott külső Fabric User Data Function definíciójából vezeti le. Ha a külső Fabric User Data Function aláírása megváltozik, újra kell létrehoznod a függvényt, hogy szinkronizáld a definícióját a frissített aláírással.
Ajánlott eljárások
Fontos
Fabric Data Warehouse-ben a skaláris UDF-eknek inlinehatónak kell lenniük a felhasználói táblák lekérdezéseihez való használathozSELECT ... FROM, de még mindig létrehozhatsz olyan függvényeket, amelyek nem inlinementhetők, ha megadod a WITH INLINE = AUTO függvényopciót. A skaláris UDF-ek, amelyek nem határolhatók, korlátozott számú helyzetben működnek. Ellenőrizheti , hogy egy UDF beágyazott-e.
Ha nem hozol létre felhasználó által definiált függvényt sémakötéssel, az alapul szolgáló objektumok változásai befolyásolhatják a függvény definícióját, és váratlan eredményeket okozhatnak a függvény meghívásakor. Amikor megadod
WITH SCHEMABINDING, mikor hozod létre a függvényt, biztosítod, hogy a későbbi változások az alapobjektumokon ne változtassanak vagy ne törjék meg a funkció viselkedését.Írd meg a felhasználó által definiált függvényeket inlinehatóvá. Az inlin fogalmáról további információért lásd: Skalár UDF beágyazása. A skalár UDF inlinebilitásá tételének példáiért lásd: Create skalár UDF in Microsoft Fabric Data Warehouse.
Amikor lehetséges, valósítsd meg a logikát T-SQL felhasználó-definiált függvényként (UDF). Külső UDF-et csak olyan funkciókhoz használj, amelyeket a T-SQL nyelvben nem lehet megvalósítani. Ez a megközelítés segít minimalizálni a távoli végrehajtási többletterhelést, és általában jobb lekérdezési teljesítményt nyújt.
Interoperabilitás
Beágyazott táblaértékű, felhasználó által definiált függvények
Egy besoros táblázatértékű függvény csak egyetlen SELECT állítást fogad el.
Felhasználó által definiált skaláris függvények
A nem sorolható függvény nem használható lekérdezésben
SELECT ... FROMegy felhasználói táblán.A következő utasítások érvényesek egy skaláris értékű függvényben:
- Hozzárendelési utasítások.
- Áramlásirányítási utasítások, kivéve
TRY...CATCHésGOTOutasításokat. -
DECLAREHelyi adatváltozókat definiáló állítások. - Hívások beépített funkciókra.
- Hivatkozások táblázatokra/nézetekre/iTVF-ekre/más skaláris UDF-ekre.
A DML utasítások nem engedélyezettek skaláris felhasználó által definiált függvényekben.
A skaláris értékű függvények törzse nem támogatja a következő beépített függvényeket:
Metadaták
Ez a szakasz felsorolja azokat a rendszerkatalógus-nézeteket, amelyekkel metaadatokat adhat vissza a felhasználó által definiált függvényekről.
sys.sql_modules: Megjeleníti Transact-SQL felhasználó által definiált függvények definícióját, valamint az inlinebilitási információkat. Például:
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: A felhasználó által definiált függvényekben definiált paraméterekkel kapcsolatos információkat jeleníti meg. Az alábbi példa a
sys.parameterskatalógus nézetet használja a függvényaláírások megjelenítésére, beleértve a visszatérési típusokat és paraméteradattípusokat:WITH metadata AS ( SELECT o.schema_id, o.object_id, o.name, p.parameter_id, p.name AS parameter_name, t.name AS type_name FROM sys.objects o JOIN sys.parameters p ON p.object_id = o.object_id JOIN sys.types t ON t.user_type_id = p.user_type_id WHERE o.type IN ('FN', 'XF') ), signature AS ( SELECT SCHEMA_NAME(schema_id) as schema_name, name, ANY_VALUE(CASE WHEN parameter_id = 0 THEN type_name END) return_type, CONCAT( SCHEMA_NAME(schema_id), '.', name, '(',STRING_AGG(CASE WHEN parameter_id > 0 THEN CONCAT(parameter_name, ' ', type_name) END, ', ' ) WITHIN GROUP (ORDER BY parameter_id), ') -> ', MAX(CASE WHEN parameter_id = 0 THEN type_name END) ) AS signature FROM metadata GROUP BY schema_id, object_id, name ) SELECT * FROM signature;sys.sql_expression_dependencies: Megjeleníti a függvény által hivatkozott mögöttes objektumokat.
Engedélyek
A Háló munkaterület rendszergazdája, a Tag és a Közreműködő szerepkör tagjai függvényeket hozhatnak létre.
Skalár UDF beágyazása
Microsoft Fabric Data Warehouse különböző beágyazott technikákat alkalmaz a felhasználó által definiált kód elosztott fordításához és végrehajtásához.
A skalár UDF beépítése alapértelmezés szerint engedélyezett.
Egyes T-SQL-szintaxisok miatt a skaláris UDF nem olvasható. Például azok a függvények, amelyek egy WHILE ciklus kombinációját tartalmazzák és egy táblázatot hivatkoznak az UDF testen belül, nem lehetnek besorolhatók.
Ellenőrizze, hogy a skaláris UDF beágyazott-e
A sys.sql_modules katalógusnézet tartalmazza az oszlopot is_inlineable, amely jelzi, hogy egy UDF beágyazott-e. A is_inlineable tulajdonság az UDF definíción belüli szintaxisnak ellenőrzéséből származik. A skaláris UDF csak fordításkor van besorolva.
A inline_eligibility_mask tulajdonság elmagyarázza, hogy milyen típusú inlining alkalmazható az UDF-re.
- Az érték
inline_eligibility_mask0azt jelenti, hogy az UDF nem határtalan. - A
inline_eligibility_mask-1érték azt jelzi, hogy az UDF jogosult a skaláris UDF beépítésre. - Az
inline_eligibility_maskérték2azt jelenti, hogy az UDF jogosult inlinezetre Expression blokkon keresztül. - Az
inline_eligibility_maskérték3azt jelenti, hogy az UDF jogosult bármelyik beágyazott technikára.
Megjegyzés:
Az Expression block inline-olás egy olyan technika, amelyet adatraktár méretű munkaterhelésekhez terveztek.
Warning
Ha egy skaláris UDF csak skaláris UDF beágyazásával inline lehet, az nem garantálja, hogy mindig besorolt a lekérdezés fordításakor.
Az alábbi minta lekérdezéssel ellenőrizheti, hogy egy skaláris UDF beágyazott-e:
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');
Ha egy skalárfüggvény nem inlineable , sys.sql_modules.is_inlineableakkor a lekérdezést akár önálló hívásként is végrehajthatod, például egy változó beállításához. A skaláris függvény nem lehet része egy SELECT ... FROM lekérdezésnek a felhasználói táblán. Például:
CREATE FUNCTION [dbo].[custom_SYSUTCDATETIME]()
RETURNS datetime2(6)
AS
BEGIN
RETURN SYSUTCDATETIME();
END
A mintaszkaláris dbo.custom_SYSUTCDATETIME , felhasználódefiniált függvény nem soros, mert egy nemdeterminisztikus rendszerfüggvényt használ, SYSUTCDATETIME(). Felhasználói SELECT ... FROM tábla lekérdezésében meghibásodik, de önálló hívásként sikerrel jár. Például:
DECLARE @utcdate datetime2(7);
SET @utcdate = dbo.custom_SYSUTCDATETIME();
SELECT @utcdate as 'utc_date';
Korlátozások
Megjegyzés:
A skaláris UDF-ek a Fabric Data Warehouse előzetes verziójának funkciói. Az aktuális előzetes verzióban a korlátozások változhatnak.
Amikor skaláris UDF-et használnak bármilyen támogatatlan helyzetben, hibaüzenetet
Scalar UDF execution is currently unavailable in this context.kapunk a lekérdezés végrehajtási idején.Egy skaláris UDF nem invonalozható Expression blokkkal , ha:
- Egy skalár UDF-et nem lehet besorolni expresszió blokkkal, ha a skaláris UDF test táblákra/nézetekre/iTVF-ekre hivatkozik.
- Egy skalár UDF-et nem lehet behúzni expresszionális blokkkal, ha a skaláris UDF test ugyanarra vagy más skaláris UDF-re utal.
- Egy skalár UDF nem invonalozható expresszió blokkkal, ha a skalár UDF test időfüggő beépített függvényt tartalmaz, például
GETDATE(). További információ: Determinisztikus és nem determinisztikus függvények. - Egy skaláris UDF nem inline be expression blockon keresztül, ha a skalár UDF test tartalmaz AI funkciókat, aggregált függvényeket, JSON_ARRAYAGG függvényt, metaadat-függvényeket, biztonsági funkciókat vagy más rendszerfunkciókat.
A skaláris UDF-et nem lehet behúzni skalár UDF beépítéssel a következő körülmények között.
- Egy skalár UDF-et nem lehet behúzni skalár UDF bevonással, ha a skalár UDF test hurkot
BREAKvagyCONTINUEállítást tartalmazWHILE. - Egy skaláris UDF-et nem lehet behúzni skalár UDF beépítéssel keresztül, ha a skaláris UDF test több
RETURNállítást tartalmaz. - Egy skalár UDF nem lehet behúzható skalár UDF beépítéssel behúzható, ha a skalár UDF test időfüggő beépített funkciót tartalmaz, például
GETDATE(). További információ: Determinisztikus és nem determinisztikus függvények. - Egy skaláris UDF nem inline skalár UDF beépítéssel bevonható, ha a skalár UDF test tartalmazza a STRING_AGG funkciót, JSON_ARRAYAGG függvényt vagy más rendszerfunkciókat.
- Be lehet ágyazni a felhasználó által definiált függvényeket. Vagyis egy felhasználó által definiált függvény meghívhat egy másikat. A beágyazási szint akkor nő, amikor a hívott függvény elindul, és csökken, amikor a hívott függvény befejezi a végrehajtást. Fabric Data Warehouse-ben akár négy szintig is beágyazhatod a felhasználó által definiált függvényeket, ha egy UDF test egy táblázatra, nézetre vagy sorbeli táblázatértékű függvényre hivatkozik, vagy egyébként akár 32 szintet is. Ha túlléped a maximális fészekezési szintet, a hívó függvénylánc meghibásodik.
- További információ: Skaláris UDF-formázási követelmények.
- Egy skalár UDF-et nem lehet behúzni skalár UDF bevonással, ha a skalár UDF test hurkot
A skalár UDF nem használható minden lekérdezési alakban, attól függően, melyik befutási technika alkalmazható.
- Skalár UDF bevonáshoz:
- A skaláris UDF nem használható és
GROUP BYORDER BY. - A skaláris UDF nem használható együtt CTE-vel.
- Egy felhasználói lekérdezés megbukhat, ha egyetlen lekérdezésben több mint 10 UDF hívást hajtanak végre.
- A skaláris UDF nem használható és
- Skalár UDF bevonáshoz:
Fabric Data Warehouse-ben skaláris UDF nem használható ,
ROLLUPCUBE, vagyGROUPING SETS.
Warning
Ha egy lekérdezés több skaláris UDF-et tartalmaz, és legalább az egyik skaláris UDF beépítésre támaszkodik, akkor az egész lekérdezésnek megfelelnie kell a skaláris UDF bekapcsolási követelményeknek.
Példák
Egy. Beágyazott táblaértékű függvény létrehozása
Az alábbi példa egy sorbeli táblázatértékű függvényt hoz létre, amely kulcsfontosságú információkat ad vissza a modulokról, paraméter objectType szerint szűrve. Tartalmaz egy alapértelmezett értéket, amely minden modult visszaad, amikor a paraméterrel rendelkező függvényt DEFAULT hívod. Ez a példa a Metadata-ban említett rendszerkatalógus nézeteket használja.
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
Hívjuk meg a függvényt, hogy visszaadja az összes sorbeli táblázatértékű függvényt (IF):
SELECT * FROM dbo.ModulesByType('IF'); -- SQL_INLINE_TABLE_VALUED_FUNCTION
Vagy keresse meg az összes skaláris függvényt (FN):
SELECT * FROM dbo.ModulesByType('FN'); -- SQL_SCALAR_FUNCTION
B. Beágyazott táblaértékű függvény eredményeinek kombinálása
Ez az egyszerű példa a korábban létrehozott inline TVF-et használja arra, hogyan lehet az eredményeit más táblázatokkal kombinálni a használatával CROSS APPLY. Itt mindkettőből sys.objects kiválasztod az összes oszlopot, valamint az ModulesByType összes sor, amely egyezik az type oszlopon. További információért APPLYa használatról lásd a FROM klaud plusz A JOIN, APPLY, PIVOT (Transact-SQL).
SELECT *
FROM sys.objects AS o
CROSS APPLY dbo.ModulesByType(o.type);
GO
C. Skaláris UDF-függvény létrehozása
Az alábbi példa egy beágyazott skaláris UDF-t hoz létre, amely maszkol egy bemeneti szöveget.
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
A függvényt a következőképpen hívhatja meg:
DECLARE @input varchar(100) = '123456789';
SELECT dbo.cleanInput (@input) AS function_output;
További példák a skaláris UDF-ek használatára a Fabric Data Warehouse-ban:
Egy utasításban SELECT :
SELECT TOP 10
t.id, t.name,
dbo.cleanInput (t.name) AS function_output
FROM dbo.MyTable AS t;
WHERE Egy záradékban:
SELECT t.id, t.name, dbo.cleanInput(t.name) AS function_output
FROM dbo.MyTable AS t
WHERE dbo.cleanInput(t.name)='myvalue';
JOIN Egy záradékban:
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);
ORDER BY Egy záradékban:
SELECT t.id, t.name, dbo.cleanInput (t.name) AS function_output
FROM dbo.MyTable AS t
ORDER BY function_output;
Az adatmanipulációs nyelv (DML) olyan utasításaiban, mint a INSERT, UPDATEvagy 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';
D. Hozzon létre egy külső függvényt
Az alábbi példa létrehoz egy külső függvényt, amelyet a dbo sémában neveznek geohash el, és amely a függvényhalmazban lévő geohash Fabric User Data Function-ra spatial_functions hivatkozik. Mivel a paraméterdefiníciók és a visszatérési típus a hivatkozott Fabric User Data Function alapján következtetett, nem szükséges ezeket kifejezetten megadni az utasításbanCREATE FUNCTION.
CREATE FUNCTION dbo.geohash
AS EXTERNAL FUNCTION spatial_functions.geohash;
Miután létrejött, a külső függvény használható T-SQL lekérdezésekben, akárcsak bármely más felhasználó által definiált vagy beépített függvény. Ott hivatkozható rá, ahol a függvényhívások támogatják, így zökkenőmentesen integrálható a Fabric User Data Functions T-SQL kódba.
Kapcsolódó tartalom
A következőkre vonatkozik:Azure Synapse Analytics
Létrehoz egy felhasználó-definiált függvényt (UDF) az Azure Synapse Analytics-ben. A felhasználó által definiált függvények olyan Transact-SQL rutinok, amelyek paramétereket fogadnak el, végrehajtanak egy műveletet, például egy összetett számítást, és a művelet eredményét értékként adják vissza. A felhasználó által definiált táblaértékelt függvények (TVF-ek) táblaadattípust ad vissza.
Jótanács
A Fabric Data Warehouse-es szintaxisért lásd az for Fabric Data Warehouse verziójátCREATE FUNCTION.
Az Azure Synapse Analyticsben
CREATE FUNCTIONa beágyazott táblaértékű függvények szintaxisával (előzetes verzió) adhat vissza egy táblát, vagy egyetlen értéket adhat vissza a skaláris függvények szintaxisával.Az Azure Synapse Analytics kiszolgáló nélküli SQL-készleteiben beágyazott táblaértékfüggvényeket hozhat létre,
CREATE FUNCTIONskaláris függvényeket azonban nem.Ezzel az utasítással készíts egy újrahasználható rutint, amelyet az alábbi módokon használhatsz:
Az olyan Transact-SQL kijelentésekben, mint például
SELECTA függvényt meghívó alkalmazásokban
Egy másik felhasználó által definiált függvény definíciójában
CHECK korlátozás definiálása egy oszlopon
Tárolt eljárás cseréje
Beágyazott függvény használata biztonsági házirend szűrőpredikátumaként
Transact-SQL szintaxis konvenciók
Szemantika
Skaláris függvény szintaxisa
-- Transact-SQL Scalar Function Syntax (in dedicated pools in Azure Synapse Analytics)
-- 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 ]
}
Beágyazott táblaértékű függvény szintaxisa
-- 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 [ ) ]
[ ; ]
Érvek
schema_name
Annak a sémának a neve, amelyhez a felhasználó által definiált függvény tartozik.
function_name
A felhasználó által definiált függvény neve. A függvényneveknek követniük kell az azonosítók szabályait, és egyedinek kell lenniük az adatbázisban és annak sémájában.
Megjegyzés:
A függvénynév után zárójeleket kell beilleszteni, még akkor is, ha nem jelölsz meg paramétert.
@ parameter_name
A felhasználó által definiált függvény paramétere. Be lehet jelenteni egy vagy több paramétert.
Egy függvénynek legfeljebb 2100 paramétere lehet. Amikor egy felhasználó vagy alkalmazás függvényt hív, minden deklarált paraméterhez megadnod kell az értéket, hacsak nem definiálsz alapértelmezett értéket a paraméterhez.
Adjon meg egy paraméternevet úgy, hogy első karakterként egy at sign (@) karaktert használ. A paraméter nevének követnie kell az azonosítók szabályait. A paraméterek lokálisak a függvényre; Ugyanazokat a paraméterneveket más függvényekben is használhatod. A paraméterek csak az állandókat helyettesíthetik; nem használhatók táblanevek, oszlopnevek vagy más adatbázis-objektumok nevei helyett.
Megjegyzés:
ANSI_WARNINGS nem teljesül, ha paramétereket ad át egy tárolt eljárásban, felhasználó által definiált függvényben, vagy ha változókat deklarál és állít be egy batch utasításban. Például, ha egy változót char(3)-ként definiálsz, majd három karakternél nagyobb értékre állítod, az adat a megadott méretre rövidítik, és az INSERT or UPDATE utasítás sikerül.
parameter_data_type
A paraméter adattípusa. Transact-SQL függvények esetében az Azure Synapse Analyticsben támogatott összes skaláris adattípus engedélyezett. Az időbélyeg (sorverzió) adattípus nem támogatott típus.
[ = alapértelmezett ]
A paraméter alapértelmezett értéke. Ha alapértelmezett értéket definiálsz, akkor a függvényt úgy is végrehajthatod, hogy megadnád az adott paraméterhez szükséges értéket.
Ha a függvény paraméterének alapértelmezett értéke van, DEFAULT akkor a kulcsszót kell megadnod, amikor a függvényt hívod az alapértelmezett érték eléréséhez. Ez a viselkedés eltér az alapértelmezett értékekkel rendelkező paraméterek tárolt eljárásokban való használatától, amelyekben a paraméter kihagyása az alapértelmezett értéket is magában foglalja.
return_data_type
Egy skaláris, felhasználó által definiált függvény visszatérési értéke. Transact-SQL függvények esetében az Azure Synapse Analyticsben támogatott összes skaláris adattípus engedélyezett. A sorverzió/időbélyeg adattípusa nem támogatott típus. A kurzor és a táblázat nonskaláris típusai nem engedélyezettek.
function_body
Transact-SQL utasítások sorozata. A function_body nem tartalmazhat állítást SELECT , és nem hivatkozhat adatbázis adatokra.
A function_body nem tud táblázatokat vagy nézeteket használni. A függvénytest más determinisztikus függvényeket is hívhat, de nemdeterminisztikus függvényeket nem.
A skaláris függvényekben a function_body Transact-SQL utasítások sorozata, amelyek együttesen egy skaláris értéket értékelnek ki.
scalar_expression
Megadja a skaláris függvény által visszaadott skaláris értéket.
select_stmt
SELECT Egyetlen utasítás, amely egy beágyazott táblaértékű függvény visszatérési értékét határozza meg. Egy besoros táblázatértékű függvény esetén nincs függvénytest; a tábla egyetlen SELECT állítás eredményhalmaza.
TABLE
Megadja, hogy a táblaértékű függvény (TVF) visszatérési értéke tábla. Csak állandókat és @local_variables-t tudsz átadni TVF-eknek.
Az inline TVF-ekben (előnézet) egyetlen állítással definiáljuk a TABLE visszahozási értéket SELECT . A beágyazott függvények nem rendelkeznek társított visszatérési változókkal.
<function_option>
Megadja, hogy a függvény az alábbi lehetőségek közül egyet vagy többet tartalmazzon.
SÉMAKÖTÉS
Megadja, hogy a függvény az általa hivatkozott adatbázis-objektumokhoz legyen kötve. Ha megadod SCHEMABINDING, nem módosíthatod az alapul szolgáló objektumokat (például egy nézetet vagy táblát) úgy, hogy az befolyásolja a függvény definícióját. Először módosítani vagy el kell hagyni a függvénydefiníciót, hogy eltávolítsuk a függőségeket a módosítani kívánt objektumról.
A függvény hivatkozási objektumokhoz való kötése csak akkor törlődik, ha az alábbi műveletek valamelyike történik:
Kihagyod a funkciót.
Te
ALTERadd a függvényutasítást, és távolítod el azSCHEMABINDINGopciót.
Csak akkor lehet sémához kötni egy függvényt, ha a következő feltételek érvényesek:
Bármely felhasználó által definiált függvény, amelyre a függvény hivatkozik, szintén sémához kötött.
A függvényhivatkozások egy- vagy kétrészes neveket használnak.
Az UDF-ek testén belül csak a beépített függvényekre és más UDF-ekre lehet hivatkozni ugyanabban az adatbázisban.
A felhasználó végrehajtja
CREATE FUNCTIONaz utasítást REFERENCES jogosultsággal rendelkezik azokon az adatbázisobjektumoknál, amelyekre a függvény hivatkozik.
A SCHEMABINDING eltávolításához használja a következőt ALTER: .
NULL ÉRTÉKET AD VISSZA NULL ÉRTÉKEN | NULL ÉRTÉKŰ BEMENET MEGHÍVÁSA
OnNULLCall Egy skaláris értékű függvény attribútumát adja meg. Ha nem határozod meg ezt az attribútumot, CALLED ON NULL INPUT alapértelmezettként implicit van, és a függvénytest akkor is fut, ha NULL argumentumként adják át.
Ajánlott eljárások
Ha nem hozol létre felhasználó által definiált függvényt a SCHEMABINDING záradékkal, az alapul szolgáló objektumok változásai befolyásolhatják a függvény definícióját, és váratlan eredményeket okozhatnak, amikor meghívod. Határozd meg a WITH SCHEMABINDING záradékot, amikor létrehozod a függvényt. Ez a záradék biztosítja, hogy a függvénydefinícióban hivatkozott objektumokat ne módosítsd, hacsak nem módosítod a függvényt is.
Interoperabilitás
A következő utasítások érvényesek egy skaláris értékű függvényben:
Hozzárendelési utasítások.
Áramlásirányítási utasítások, kivéve a TRY-t... CATCH nyilatkozatok.
DECLARE utasításokat definiálnak, amelyek helyi adatváltozókat definiálnak.
Egy besorbeli táblázatértékű függvényben (előnézet) csak egyetlen select utasítást használhatsz.
Korlátozások
Felhasználó-definiált függvényeket nem használhatsz olyan műveletekhez, amelyek módosítják az adatbázis állapotát.
Be lehet ágyazni a felhasználó által definiált függvényeket. Egy felhasználó által definiált függvény meghívhat egy másikat. A beágyazási szint akkor nő, amikor a hívott függvény elindul, és csökken, amikor a hívott függvény befejezi a végrehajtást. Ha túlléped a maximális fészkelési szintet, az egész hívó függvénylánc meghibásodik.
Nem lehet objektumokat, beleértve funkciókat is, létrehozni a master szerver nélküli SQL poolod adatbázisában az Azure Synapse Analytics-ben.
Metadaták
Ez a szakasz felsorolja azokat a rendszerkatalógus-nézeteket, amelyekkel metaadatokat adhat vissza a felhasználó által definiált függvényekről.
sys.sql_modules: Megjeleníti Transact-SQL felhasználó által definiált függvények definícióját. Például:
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: A felhasználó által definiált függvényekben definiált paraméterekkel kapcsolatos információkat jeleníti meg.
sys.sql_expression_dependencies: Megjeleníti a függvény által hivatkozott mögöttes objektumokat.
Engedélyek
Engedélyt CREATE FUNCTION kell megadni az adatbázisban, és ALTER engedélyt kell adni azon a sémán, amelyben a függvényt létrehozják.
Példák
Egy. Skaláris értékű, felhasználó által definiált függvény használata adattípus módosításához
Ez az egyszerű függvény int adattípust vesz bemenetként, és egy tizedes (10,2) adattípust ad vissza kimenetként.
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';
Megjegyzés:
Skaláris függvények nem elérhetők szerver nélküli SQL poolokban.
B. Beágyazott táblaértékű függvény létrehozása
Az alábbi példa egy sorbeli táblázatértékű függvényt hoz létre, amely kulcsfontosságú információkat ad vissza a modulokról, paraméter objectType szerint szűrve. Tartalmaz egy alapértelmezett értéket, amely minden modult visszaad, amikor a paraméterrel rendelkező függvényt DEFAULT hívod. Ez a példa a Metadata-ban említett rendszerkatalógus nézeteket használja.
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
A függvényt az összes view (V) objektum visszaadására hívhatod a következőket:
select * from dbo.ModulesByType('V');
Megjegyzés:
Az inline táblázat-érték függvények elérhetők szerver nélküli SQL poolokban, de előnézetben a dedikált SQL poolokban.
C. Beágyazott táblaértékű függvény eredményeinek kombinálása
Ez az egyszerű példa a korábban létrehozott inline TVF-et használja arra, hogyan lehet az eredményeit más táblázatokkal kombinálni a használatával CROSS APPLY. Ebben a példában mindkettőből sys.objects kiválasztod az összes oszlopot, valamint az ModulesByType összes sor, amely egyezik az type oszlopban. További információért APPLYa használatról lásd a FROM klaud plusz A JOIN, APPLY, PIVOT (Transact-SQL).
SELECT *
FROM sys.objects o
CROSS APPLY dbo.ModulesByType(o.type);
GO
Megjegyzés:
Az inline táblázat-érték függvények elérhetők szerver nélküli SQL poolokban, de előnézetben a dedikált SQL poolokban.