CREATE FUNCTION

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 a Fabric Data Warehouse előzetes verziójának funkciói.

Fontos

A Fabric Data Warehouse-ban a skaláris UDF-eknek beágyazottnak kell lenniük a felhasználói táblák lekérdezéseihez SELECT ... FROM , de továbbra is létrehozhat olyan függvényeket, amelyek nem beágyazottak. 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.

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:

  • Az olyan Transact-SQL kijelentésekben, mint például SELECT
  • Transact-SQL adatmanipulációs utasításokban (DML), például UPDATE: , INSERTés DELETE
  • Függvényt hívó alkalmazásokban
  • Egy másik felhasználó által definiált függvény definíciójában
  • Tárolt eljárás cseréje

Megadhatod CREATE OR ALTER FUNCTION , hogy létrehozz egy új függvényt, ha nincs ilyen néven, vagy módosíthatsz 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>::=   
{  
    [ 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 [ ) ]
[ ; ]

É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éter értékét meg kell adni, hacsak nincs alapértelmezett paraméter meghatározása.

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 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ényei esetében minden adattípus engedélyezett, kivéve a sorfordítási/időbélyeget. A nonskaláris típusok, mint például a táblázat , nem engedélyezettek.

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 és BEGIN/END blokkok)
  • Helyi változók
  • Elérhető beépített SQL-függvények hívása
  • Hívások más UDF-ekhez
  • SELECT utasí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 (WHILE hurkok, RETURNS)

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 INLINE, ENCRYPTION, és EXECUTE AS kulcsszavak nem támogatottak.

A támogatott funkciók a következők:

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 ALTER add a függvényutasítást, és távolítod el az SCHEMABINDING opció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 FUNCTION az 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 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á. További információért lásd: A skalár UDF beépítése.

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

Korlátozások

Megjegyzés:

Az aktuális előzetes verzióban a korlátozások változhatnak.

  • 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. 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.

  • A skaláris UDF-ek nem használhatók felhasználói táblák lekérdezéseiben SELECT ... FROM , ha:

  • A skalár UDF nem használható minden lekérdezési alakban, például CTE-kben, és GROUP BY amikor:

    • A skalár UDF test táblázatokra/nézetekre/iTVF-ekre/egyéb skaláris UDF-ekre hivatkozik.
    • A skalár UDF tartalmazza ezeket az adattípusokat bemeneti paraméterként, helyi változóként vagy visszaadó adattípusként: varchar(max), nvarchar(max), varbinary(max), binary(max).
    • A skaláris UDF test MI funkciókra hív meg.
    • A fenti esetekben általános skaláris udf beágyazási követelmények vonatkoznak, lásd Skalár UDF beágyazási követelményeket.
  • Ha egy skaláris UDF tartalmazza az alábbiak egyikét, egy felhasználói lekérdezés meghibásíthat, ha egyetlen lekérdezésben több mint 10 UDF hívást hajtanak végre:

    • A skalár UDF test táblázatokra/nézetekre/iTVF-ekre/egyéb skaláris UDF-ekre hivatkozik.
    • A skalár UDF tartalmazza ezeket az adattípusokat bemeneti paraméterként, helyi változóként vagy visszaadó adattípusként: varchar(max), nvarchar(max), varbinary(max), binary(max).
    • A skaláris UDF test AI funkciókhoz hívó hívásokat tartalmaz.
  • Amikor skaláris UDF-et használnak bármilyen támogatatlan helyzetben, a lekérdezés végrehajtási idején egy "Scalar UDF execution is currently unavailable in this context." hibaüzenetet látunk.

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.

  • 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 nem van besorolva a fordítási idő előtt.

A inline_eligibility_mask tulajdonság elmagyarázza, hogy milyen típusú inlining alkalmazható az UDF-re.

  • Az érték 0 azt jelenti, hogy az UDF nem határtalan.
  • A - 1 érték azt jelzi, hogy az UDF jogosult a skaláris UDF beépítésre.
  • Az érték 2 azt jelenti, hogy az UDF jogosult az expresszionális blokkon keresztül beágyazásra.
  • Az érték 3 azt jelenti, hogy az UDF jogosult bármelyik beágyazott technikára.

Ha egy skaláris UDF inlineable, az nem garantálja, hogy mindig beírt legyen a lekérdezés fordításakor.

Fabric Data Warehouse (lekérdezés szerint) dönti el, melyik beilleszkedési technikát alkalmazza.

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. De a skaláris függvény nem lehet része egy SELECT ... FROM lekérdezésnek egy felhasználói táblán. Például:

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

A mintaszkalár dbo.custom_SYSUTCDATETIME felhasználó által definiált függvény nem soros egy nem-determináns rendszerfüggvény használata miatt, 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';

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

A következőkre vonatkozik:Azure Synapse AnalyticsAnalytics Platform System (PDW)

Létrehoz egy felhasználó által definiált függvényt (UDF) az Azure Synapse Analytics vagy az Analytics Platform System (PDW) rendszerben. 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 Analytics Platform Systemben (PDW) a visszatérési értéknek skaláris (egyetlen) értéknek kell lennie.

  • Az Azure Synapse Analyticsben CREATE FUNCTION a 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 FUNCTION skalá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 SELECT

  • A 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 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 ]  
}  

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éter értékét meg kell adni, hacsak nincs alapértelmezett paraméter meghatározása.

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 ALTER add a függvényutasítást, és távolítod el az SCHEMABINDING opció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 FUNCTION az 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.

Következő lépés