Sdílet prostřednictvím


VYTVOŘIT FUNKCI

platí pro:koncový bod sql Analytics a sklad v Microsoft Fabric

CREATE FUNCTION může vytvářet vložené funkce tabulek 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í funkce definované uživatelem, které nejsou vložené, fungují v omezeném počtu scénářů. Můžete zkontrolovat , jestli se dá VDF inlinovat.

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. Skalární funkce vrací skalární hodnotu, například číslo nebo řetězec. Uživatelem definované funkce s hodnotami tabulky (TVF) vracejí tabulku.

Slouží CREATE FUNCTION k vytvoření opakovaně použitelné rutiny T-SQL, kterou lze použí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 , INSERTa DELETE
  • V aplikacích, které funkci volají
  • V definici další uživatelem definované funkce
  • Nahrazení uložené procedury

Návod

Novou funkci můžete zadat CREATE OR ALTER FUNCTION , pokud neexistuje podle názvu nebo změnit existující funkci v jediném příkazu.

Transact-SQL konvence syntaxe

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í splňovat pravidla pro identifikátory a musí být jedinečné v rámci databáze a pro jeho schéma.

Poznámka:

Za názvem funkce se vyžadují závorky, i když není zadaný parametr.

@ parameter_name

Parametr v uživatelem definované funkci. Lze deklarovat jeden nebo více parametrů.

Funkce může mít maximálně 2 100 parametrů. Hodnota každého deklarovaného parametru musí být zadána uživatelem při provádění funkce, pokud není pro parametr definováno výchozí nastavení.

Zadejte název parametru pomocí znaku at (@) jako prvního znaku. Název parametru musí být v souladu s pravidly pro identifikátory. Parametry jsou pro funkci lokální; Stejné názvy parametrů lze použít i v jiných funkcích. Parametry mohou probíhat pouze konstanty; Nelze je použít místo názvů tabulek, názvů sloupců ani názvů jiných databázových objektů.

Poznámka:

ANSI_WARNINGS při předávání parametrů v uložené procedury, uživatelem definované funkci nebo při deklaraci a nastavení proměnných v dávkovém příkazu. Pokud je například proměnná definována jako char(3) a pak je nastavená na hodnotu větší než tři znaky, data se zkrátí na definovanou velikost a příkaz INSERT nebo UPDATE bude úspěšný.

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 je definována výchozí hodnota, lze funkci provést bez určení hodnoty tohoto parametru.

Pokud má parametr funkce výchozí hodnotu, musí být při volání funkce zadáno klíčové slovo DEFAULT , aby se načetla výchozí hodnota. 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ítkarowversion/. Nepovolené typy, jako je tabulka , 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/ELSE a BEGIN/END bloky)
  • Místní proměnné
  • Dostupná volání předdefinovaných funkcí SQL
  • Volání jiných uživatelem definovaných funkcí
  • SELECT příkazy a odkazy na tabulky, zobrazení a vložené funkce s hodnotami tabulky

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 vloženou funkci s hodnotou tabulky neexistuje tělo funkce; tabulka je sada výsledků jednoho SELECT příkazu.

STŮL

Určuje, že návratová hodnota funkce hodnotící tabulku (TVF) je tabulka. Do TVF lze předat pouze konstanty a @local_variables .

Ve vložených TVF (Preview) je návratová hodnota TABLE definována pomocí jediného SELECT příkazu. Vložené funkce nemají přidružené návratové proměnné.

<function_option>

V datovém skladu infrastruktury nejsou podporována INLINEENCRYPTIONklíčová slova a EXECUTE AS .

Mezi podporované možnosti funkce patří:

SCHEMABINDING

Určuje, že funkce je svázána s databázovými objekty, na které odkazuje. Pokud je zadána funkce SCHEMABINDING, základní objekty nelze upravit způsobem, který by ovlivnil definici funkce. Samotná definice funkce musí být nejprve upravena nebo zrušena, aby se odstranily závislosti na objektu, který má být změněn.

Vazba funkce na objekty, na které odkazuje, je odstraněna pouze v případě, že dojde k jedné z následujících akcí:

  • Funkce je zrušena.

  • Funkce je upravena pomocí příkazu ALTER s parametrem SCHEMABINDING, který není zadán.

Funkce může být svázána se schématem pouze tehdy, jsou-li splněny následující podmínky:

  • Všechny uživatelem definované funkce odkazované funkcí jsou také vázané na schéma.

  • Na objekty, na které funkce odkazuje, se odkazuje pomocí názvu se dvěma částmi.

  • V textu funkcí definovaných uživatelem lze odkazovat pouze na předdefinované funkce a jiné funkce definované uživatelem ve stejné databázi.

  • Uživatel, který příkaz spustil CREATE FUNCTION , má oprávnění REFERENCES k databázovým objektům, 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 není zadán, CALLED ON NULL INPUT implicitně se předpokládá a tělo funkce se spustí i v případě, že NULL je předán jako argument.

Osvědčené postupy

  • Pokud se uživatelem definovaná funkce nevytvoří pomocí vazby schématu, můžou změny provedené v podkladových objektech ovlivnit definici funkce a při vyvolání způsobit neočekávané výsledky. Při vytváření funkce se doporučuje zadat WITH SCHEMABINDING klauzuli. Tím se zajistí, že objekty odkazované v definici funkce nelze upravit, pokud není také změněna.

  • Zápis uživatelem definovaných funkcí tak, aby byly vložené. Další informace najdete v tématu Innerování skalárních uživatelsky definovaných funkcí.

Interoperabilita

Vložené funkce definované uživatelem s hodnotou tabulky

Ve vložené funkci s hodnotou tabulky je povolen pouze jeden příkaz select.

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 s výjimkou TRY...CATCH příkazů
    • DECLARE příkazy definující místní datové proměnné
  • V těle skalární funkce s hodnotou nejsou podporované následující předdefinované funkce:

  • Skalární funkce definované uživatelem se nedají použít v dotazu na uživatelskou tabulku, SELECT ... FROM když:

  • Skalární funkce definované uživatelem se v dotazu nedají použít v následujících případech:

    • Funkce definovaná uživatelem GROUP BY se přímo volá v klauzuli.
    • Funkce definovaná uživatelem ORDER BY se přímo volá v klauzuli.
    • volající dotaz má společný výraz tabulky (CTE).
  • Rekurzivní skalární funkce definované uživatelem se nepodporují.

  • Dotaz uživatele může selhat, pokud se v jednom dotazu provede více než 10 volání uživatelem definované uživatelem.

  • V některýchhraničních zařízeních v některých hraničních případech složitost uživatelského dotazu brání vkládání, v takovém případě skalární UDF není vložený a dotaz uživatele selže.

  • Pokud se skalární funkce definovaná uživatelem používá v jakémkoli nepodporovaném scénáři, zobrazí se chybová zpráva "Scalar UDF execution is currently unavailable in this context."

Omezení

Poznámka:

Během aktuální verze Preview se omezení můžou změnit.

Uživatelem definované funkce nelze použít k provádění akcí, které upravují stav databáze.

Uživatelem definované funkce lze vnořit; to znamená, že jedna uživatelem definovaná funkce může volat jinou. Úroveň vnoření se zvýší při spuštění vykonávání volané funkce a sníží se při dokončení provádění volané funkce. Uživatelem definované funkce ve službě Fabric Data Warehouse je možné vnořit až čtyři úrovně, pokud tělo uživatelem odkazuje na funkci s hodnotou tabulky, zobrazení nebo v řádku nebo až na 32 úrovní v opačném případě. Překročení maximálních úrovní vnoření způsobí selhání volajícího řetězce funkcí.

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í

Funkce můžou vytvářet členové role správce pracovního prostoru Infrastruktury, člena a přispěvatele.

Vložení skalárních uživatelsky definovaných funkcí

Microsoft Fabric Data Warehouse používá skalární vkládání definované uživatelem ke kompilaci a spouštění uživatelem definovaného kódu distribuovaným způsobem. Skalární vkládání uživatelem definované uživatelem je ve výchozím nastavení povolené.

Skalární vkládání uživatelem je technika optimalizace výkonu, která byla poprvé představena v Microsoft SQL Serveru 2019 (15.0), ale ve službě Fabric Data Warehouse určuje podporovanou sadu scénářů. Ve službě Fabric Data Warehouse se skalární funkce definované uživatelem automaticky transformují na skalární výrazy nebo skalární poddotazy, které se nahradí v volajícím dotazu místo operátoru definovaného uživatelem.

Některá syntaxe T-SQL způsobí, že skalární UDF není vložený. Funkce, které obsahují smyčku WHILE , více RETURN příkazů nebo volání nedeterministické předdefinované funkce SQL (například GETUTCDATE() nebo GETDATE()) nelze inlinovat. Další informace naleznete v tématu Skalární UDF inlining požadavky.

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 je odvozena z kontroly syntaxe uvnitř definice UDF. Skalární funkce definovaná uživatelem není vložena před časem kompilace. Hodnota 1 indikuje, že funkce definovaná uživatelem je vložená, zatímco hodnota 0 indikuje, že není vložená. Pokud je skalární UDF vložený, nezaručuje, že se při kompilaci dotazu vždy inlineuje.

V závislosti na celkové složitosti dotazů rozhoduje datový sklad Prostředků infrastruktury (podle dotazu).

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í vložená sys.sql_modules.is_inlineable, můžete dotaz přesto spustit jako samostatné volání, například nastavit proměnnou. Skalární funkce ale nemůže být součástí SELECT ... FROM dotazu v tabulce uživatele. Například:

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

Ukázková dbo.custom_SYSUTCDATETIME skalární uživatelem definovaná funkce není vložená z důvodu použití nedeterminantní systémové funkce, SYSUTCDATETIME(). Při použití v dotazu na uživatelskou SELECT ... FROM tabulku selže, ale bude úspěšný jako samostatné volání, 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 vytvoří vloženou funkci s hodnotou tabulky, která vrátí některé klíčové informace o modulech, filtrování podle parametru objectType . Obsahuje výchozí hodnotu pro vrácení všech modulů při zavolání funkce s parametrem DEFAULT . Tento příklad používá některá zobrazení katalogu systému uvedená 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

Funkci pak můžete volat, aby se vrátily všechny vložené funkce s hodnotami tabulky (IF) s:

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 používá dříve vytvořenou vloženou tvF k předvedení, jak lze výsledky kombinovat s jinými tabulkami pomocí křížového použití. Tady vybereme všechny sloupce z obou sys.objects sloupců a výsledky ModulesByType všech řádků odpovídajících sloupci type . Další informace o použití naleznete v tématu 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';

platí pro: Azure Synapse AnalyticsAnalytics Platform System (PDW)

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.

  • V systému PDW (Analytics Platform System) musí být návratová hodnota skalární (jednoduchá).

  • Ve službě Azure Synapse Analytics CREATE FUNCTION můž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 FUNCTION ale ne skalární funkce.

    Tento příkaz slouží k vytvoření opakovaně použitelné rutiny, kterou lze použít těmito způsoby:

  • V Transact-SQL příkazy, jako je SELECT

  • V aplikacích, které funkci volají

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

Návod

Syntaxi ve službě Fabric Data Warehouse najdete ve verzi CREATE FUNCTION pro Microsoft Fabric Data Warehouse.

Transact-SQL konvence syntaxe

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í splňovat pravidla pro identifikátory a musí být jedinečné v rámci databáze a pro jeho schéma.

Poznámka:

Za názvem funkce se vyžadují závorky, i když není zadaný parametr.

@ parameter_name

Parametr v uživatelem definované funkci. Lze deklarovat jeden nebo více parametrů.

Funkce může mít maximálně 2 100 parametrů. Hodnota každého deklarovaného parametru musí být zadána uživatelem při provádění funkce, pokud není pro parametr definováno výchozí nastavení.

Zadejte název parametru pomocí znaku at (@) jako prvního znaku. Název parametru musí být v souladu s pravidly pro identifikátory. Parametry jsou pro funkci lokální; Stejné názvy parametrů lze použít i v jiných funkcích. Parametry mohou probíhat pouze konstanty; Nelze je použít místo názvů tabulek, názvů sloupců ani názvů jiných databázových objektů.

Poznámka:

ANSI_WARNINGS při předávání parametrů v uložené procedury, uživatelem definované funkci nebo při deklaraci a nastavení proměnných v dávkovém příkazu. Pokud je například proměnná definována jako char(3) a pak je nastavená na hodnotu větší než tři znaky, data se zkrátí na definovanou velikost a příkaz INSERT nebo UPDATE bude úspěšný.

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 časového razítka (rowversion) není podporovaným typem.

[ = výchozí ]

Výchozí hodnota parametru. Pokud je definována výchozí hodnota, lze funkci provést bez určení hodnoty tohoto parametru.

Pokud má parametr funkce výchozí hodnotu, musí být klíčové slovo DEFAULT zadáno při zavolání funkce pro načtení výchozí hodnoty. 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časového razítkarowversion/ není podporovaným typem. Typy kurzoru a tabulky nejsou povoleny.

function_body

Řada příkazů Transact-SQL Function_body nemůže obsahovat SELECT příkaz a nemůže odkazovat na data databáze. Function_body nemůže odkazovat na tabulky ani zobrazení. Tělo 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 vloženou funkci s hodnotou tabulky neexistuje tělo funkce; tabulka je sada výsledků jednoho SELECT příkazu.

STŮL

Určuje, že návratová hodnota funkce hodnotící tabulku (TVF) je tabulka. Do TVF lze předat pouze konstanty a @local_variables .

Ve vložených TVF (Preview) je návratová hodnota TABLE definována pomocí jediného SELECT příkazu. Vložené funkce nemají přidružené 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. Pokud je zadána funkce SCHEMABINDING, základní objekty nelze upravit způsobem, který by ovlivnil definici funkce. Samotná definice funkce musí být nejprve upravena nebo zrušena, aby se odstranily závislosti na objektu, který má být změněn.

Vazba funkce na objekty, na které odkazuje, je odstraněna pouze v případě, že dojde k jedné z následujících akcí:

  • Funkce je zrušena.

  • Funkce je upravena pomocí příkazu ALTER s parametrem SCHEMABINDING, který není zadán.

Funkce může být svázána se schématem pouze tehdy, jsou-li splněny následující podmínky:

  • Všechny uživatelem definované funkce odkazované funkcí jsou také vázané na schéma.

  • Funkce a další funkce definované uživatelem, na které funkce odkazuje, se odkazují pomocí názvu jedné nebo dvoudílné části.

  • V textu funkcí definovaných uživatelem lze odkazovat pouze na předdefinované funkce a jiné funkce definované uživatelem ve stejné databázi.

  • Uživatel, který příkaz spustil CREATE FUNCTION , má oprávnění REFERENCES k databázovým objektům, 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 není zadán, CALLED ON NULL INPUT implicitně se předpokládá a tělo funkce se spustí i v případě, že NULL je předán jako argument.

Osvědčené postupy

Pokud uživatelem definovaná funkce není vytvořena s klauzulí SCHEMABINDING, změny provedené v podkladových objektech mohou ovlivnit definici funkce a při vyvolání způsobit neočekávané výsledky. Při vytváření funkce se doporučuje zadat WITH SCHEMABINDING klauzuli. Tím se zajistí, že objekty odkazované v definici funkce nelze upravit, pokud není také změněna.

Interoperabilita

Následující příkazy jsou platné ve skalární-hodnotové funkci:

  • Příkazy přiřazení.

  • Příkazy control-of-Flow s výjimkou TRY... Příkazy CATCH.

  • Příkazy DECLARE definující místní datové proměnné.

Ve vložené funkci s hodnotou tabulky (Preview) je povolen pouze jeden příkaz select.

Omezení

Uživatelem definované funkce nelze použít k provádění akcí, které upravují stav databáze.

Uživatelem definované funkce lze vnořit; to znamená, že jedna uživatelem definovaná funkce může volat jinou. Úroveň vnoření se zvýší při spuštění vykonávání volané funkce a sníží se při dokončení provádění volané funkce. Překročení maximální úrovně vnoření způsobí selhání celého řetězce volaných funkcí. V Microsoft Fabric Data Warehouse je možné uživatelem definované funkce vnořit až pět úrovní.

Objekty, včetně funkcí, nelze vytvořit v master databázi bezserverového fondu SQL ve službě 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 oprávnění CREATE FUNCTION v databázi a alter oprávnění ke schématu, ve kterém se funkce vytváří.

Příklady

A. Změna datového typu pomocí skalární funkce definované uživatelem

Tato jednoduchá funkce přebírá jako vstup datový typ int a jako výstup vrátí datový typ decimal(10;2 ).

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 bezserverových fondech SQL.

B. Vytvoření vložené funkce s hodnotou tabulky

Následující příklad vytvoří vloženou funkci s hodnotou tabulky, která vrátí některé klíčové informace o modulech, filtrování podle parametru objectType . Obsahuje výchozí hodnotu pro vrácení všech modulů při zavolání funkce s parametrem DEFAULT . Tento příklad používá některá zobrazení katalogu systému uvedená 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

Funkci pak můžete volat, aby se vrátily všechny objekty zobrazení (V) s:

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

Poznámka:

Vložené funkce pro hodnotu tabulky jsou k dispozici v bezserverových fondech SQL, ale ve verzi Preview ve vyhrazených fondech SQL.

C. Kombinování výsledků vložené funkce s hodnotou tabulky

Tento jednoduchý příklad používá dříve vytvořenou vloženou tvF k předvedení, jak lze výsledky kombinovat s jinými tabulkami pomocí křížového použití. Tady vybereme všechny sloupce z obou sys.objects sloupců a výsledky ModulesByType všech řádků odpovídajících sloupci type . Další informace o použití naleznete v tématu KLAUZULE FROM plus JOIN, APPLY, PIVOT (Transact-SQL).

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

Poznámka:

Vložené funkce pro hodnotu tabulky jsou k dispozici v bezserverových fondech SQL, ale ve verzi Preview ve vyhrazených fondech SQL.

Další krok