Sdílet prostřednictvím


FUNKCE VYTVOŘENÍ (Transact-SQL)

platí pro:SQL ServerAzure SQL Databaseazure SQL Managed Instance

Vytvoří uživatelsky definovanou funkci (UDF), což je Transact-SQL rutina nebo rutina modulu CLR (Common Language Runtime). Uživatelem definovaná funkce přijímá parametry, provádí akci, jako je například složitý výpočet, a vrací výsledek této akce jako hodnotu. Vrácenou hodnotou může být buď skalární (jednoduchá) hodnota, nebo tabulka. 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é volají funkci
  • V definici další uživatelem definované funkce
  • Parametrizace zobrazení nebo vylepšení funkcí indexovaného zobrazení
  • Definování sloupce v tabulce
  • Definování CHECK vazby na sloupec
  • Nahrazení uložené procedury
  • Použití vložené funkce jako predikátu filtru pro zásadu zabezpečení

Integrace .NET Framework CLR do SQL Server je popsána v tomto článku. Integrace CLR se nevztahuje na Azure SQL Database.

Informace o Azure Synapse Analytics nebo Microsoft Fabric najdete v tématu CREATE FUNCTION (Azure Synapse Analytics a Microsoft Fabric).

Transact-SQL konvence syntaxe

Syntaxe

Syntaxe pro Transact-SQL skalárních funkcí.

CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type [ NULL ]
 [ = default ] [ READONLY ] }
    [ , ...n ]
  ]
)
RETURNS return_data_type
    [ WITH <function_option> [ , ...n ] ]
    [ AS ]
    BEGIN
        function_body
        RETURN scalar_expression
    END
[ ; ]

Syntaxe pro Transact-SQL vložených funkcí hodnotících tabulku.

CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type [ NULL ]
    [ = default ] [ READONLY ] }
    [ , ...n ]
  ]
)
RETURNS TABLE
    [ WITH <function_option> [ , ...n ] ]
    [ AS ]
    RETURN [ ( ] select_stmt [ ) ]
[ ; ]

Syntaxe pro Transact-SQL vícepříkazových funkcí hodnotících tabulku.

CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type [ NULL ]
    [ = default ] [ READONLY ] }
    [ , ...n ]
  ]
)
RETURNS @return_variable TABLE <table_type_definition>
    [ WITH <function_option> [ , ...n ] ]
    [ AS ]
    BEGIN
        function_body
        RETURN
    END
[ ; ]

Syntaxe pro klauzule funkce Transact-SQL.

<function_option> ::=
{
    [ ENCRYPTION ]
  | [ SCHEMABINDING ]
  | [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]
  | [ EXECUTE_AS_Clause ]
  | [ INLINE = { ON | OFF } ]
}

<table_type_definition> ::=
( { <column_definition> <column_constraint>
  | <computed_column_definition> }
    [ <table_constraint> ] [ , ...n ]
)
<column_definition> ::=
{
    { column_name data_type }
    [ [ DEFAULT constant_expression ]
      [ COLLATE collation_name ] | [ ROWGUIDCOL ]
    ]
    | [ IDENTITY [ (seed , increment ) ] ]
    [ <column_constraint> [ ...n ] ]
}

<column_constraint> ::=
{
    [ NULL | NOT NULL ]
    { PRIMARY KEY | UNIQUE }
      [ CLUSTERED | NONCLUSTERED ]
      [ WITH FILLFACTOR = fillfactor
        | WITH ( <index_option> [ , ...n ] )
      [ ON { filegroup | "default" } ] ]
  | [ CHECK ( logical_expression ) ] [ , ...n ]
}

<computed_column_definition> ::=
column_name AS computed_column_expression

<table_constraint> ::=
{
    { PRIMARY KEY | UNIQUE }
      [ CLUSTERED | NONCLUSTERED ]
      ( column_name [ ASC | DESC ] [ , ...n ]
        [ WITH FILLFACTOR = fillfactor
        | WITH ( <index_option> [ , ...n ] )
  | [ CHECK ( logical_expression ) ] [ , ...n ]
}

<index_option> ::=
{
    PAD_INDEX = { ON | OFF }
  | FILLFACTOR = fillfactor
  | IGNORE_DUP_KEY = { ON | OFF }
  | STATISTICS_NORECOMPUTE = { ON | OFF }
  | ALLOW_ROW_LOCKS = { ON | OFF }
  | ALLOW_PAGE_LOCKS = { ON | OFF }
}

Syntaxe pro skalární funkce CLR.

CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name
( { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type [ NULL ]
    [ = default ] }
    [ , ...n ]
)
RETURNS { return_data_type }
    [ WITH <clr_function_option> [ , ...n ] ]
    [ AS ] EXTERNAL NAME <method_specifier>
[ ; ]

Syntaxe pro funkce CLR s hodnotami tabulky.

CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name
( { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type [ NULL ]
    [ = default ] }
    [ , ...n ]
)
RETURNS TABLE <clr_table_type_definition>
    [ WITH <clr_function_option> [ , ...n ] ]
    [ ORDER ( <order_clause> ) ]
    [ AS ] EXTERNAL NAME <method_specifier>
[ ; ]

Syntaxe klauzulí funkce CLR.

<order_clause> ::=
{
   <column_name_in_clr_table_type_definition>
   [ ASC | DESC ]
} [ , ...n ]

<method_specifier> ::=
    assembly_name.class_name.method_name

<clr_function_option> ::=
{
    [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]
  | [ EXECUTE_AS_Clause ]
}

<clr_table_type_definition> ::=
( { column_name data_type } [ , ...n ] )

Syntaxe OLTP v paměti pro nativně kompilované, skalární uživatelsky definované funkce.

CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name
 ( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type
    [ NULL | NOT NULL ] [ = default ] [ READONLY ] }
    [ , ...n ]
  ]
)
RETURNS return_data_type
     WITH <function_option> [ , ...n ]
    [ AS ]
    BEGIN ATOMIC WITH (set_option [ , ... n ] )
        function_body
        RETURN scalar_expression
    END

<function_option> ::=
{
  |  NATIVE_COMPILATION
  |  SCHEMABINDING
  | [ EXECUTE_AS_Clause ]
  | [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]
}

Argumenty

NEBO ALTER

Platí pro: SQL Server 2016 (13.x) SP 1 a novější verze a Azure SQL Database.

Podmíněně změní funkci pouze v případě, že již existuje.

Pro CLR je k dispozici volitelná OR ALTER syntaxe, počínaje SQL Server 2016 (13.x) SP 1 CU 1.

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í být v souladu s pravidly pro identifikátory a musí být jedinečné v rámci databáze a jejího schématu.

Závorky jsou vyžadovány za názvem funkce, i když není zadán 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 zavináče (@) 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 nahradit pouze konstanty; Nelze je použít místo názvů tabulek, sloupců nebo názvů jiných databázových objektů.

ANSI_WARNINGS se nedodržuje při předávání parametrů v uložené proceduře, uživatelsky definované funkci nebo při deklaraci a nastavení proměnných v dávkovém příkazu. 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ý.

[ type_schema_name. ] parameter_data_type

Datový typ parametru a volitelně schéma, do kterého patří. Pro Transact-SQL funkce jsou povoleny všechny datové typy, včetně uživatelsky definovaných typů CLR a uživatelsky definovaných typů tabulek, s výjimkou datového typu časového razítka . U funkcí CLR jsou povoleny všechny datové typy, včetně uživatelsky definovaných typů CLR, s výjimkou textových, ntextových, obrázkových, uživatelsky definovaných typů tabulek a datových typů časových razítek . Neskalární typy, kurzor a tabulka, nelze zadat jako datový typ parametru ani ve funkcích Transact-SQL ani CLR.

Pokud type_schema_name není zadaný, databázový stroj vyhledá scalar_parameter_data_type v následujícím pořadí:

  • Schéma, které obsahuje názvy systémových datových typů SQL Server.
  • Výchozí schéma aktuálního uživatele v aktuální databázi.
  • Schéma dbo v aktuální databázi.

[ = výchozí ]

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

Pro funkce CLR lze zadat výchozí hodnoty parametrů, s výjimkou datových typů varchar(max) a varbinary(max).

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. Klíčové DEFAULT slovo však není vyžadováno při vyvolání skalární funkce pomocí příkazu EXECUTE .

JEN KE ČTENÍ

Označuje, že parametr nelze aktualizovat ani upravit v rámci definice funkce. READONLY je vyžadován pro uživatelem definované parametry typu tabulky (TVP) a nelze jej použít pro žádný jiný typ parametru.

return_data_type

Návratová hodnota skalární uživatelem definované funkce. U Transact-SQL funkcí jsou povoleny všechny datové typy, včetně uživatelsky definovaných typů CLR, s výjimkou datového typu časového razítka . U funkcí CLR jsou povoleny všechny datové typy, včetně uživatelsky definovaných typů CLR, s výjimkou datových typů text, ntext, image a timestamp . Neskalární typy, kurzor a tabulka, nelze zadat jako návratový datový typ ve funkcích Transact-SQL ani CLR.

function_body

Určuje, že řada Transact-SQL příkazů, které dohromady nevytvářejí vedlejší účinek, jako je změna tabulky, definuje hodnotu funkce. function_body se používá pouze ve skalárních funkcích a vícepříkazových funkcích MSTVF (Table-Value).

Ve skalárních funkcích je function_body řada Transact-SQL příkazů, které jsou společně vyhodnoceny jako skalární hodnota.

V MSTVF je function_body řada Transact-SQL příkazů, které naplňují návratovou TABLE proměnnou.

scalar_expression

Určuje skalární hodnotu, kterou skalární funkce vrátí.

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 .

V inline TVF je návratová hodnota definována TABLE prostřednictvím jediného SELECT příkazu. Vložené funkce nemají přiřazené návratové proměnné.

V MSTVF je @return_variable proměnná TABLE , která se používá k ukládání a shromažďování řádků, které by měly být vráceny jako hodnota funkce. @ return_variable lze zadat pouze pro Transact-SQL funkce, nikoli pro funkce CLR.

select_stmt

Jediný SELECT příkaz, který definuje návratovou hodnotu vložené funkce hodnotící tabulku (TVF).

OBJEDNAT (<order_clause>)

Určuje pořadí, ve kterém jsou výsledky z funkce s hodnotami tabulky vraceny. Další informace naleznete v části Použití pořadí řazení ve funkcích s hodnotami tabulky CLR dále v tomto článku.

EXTERNÍ NÁZEV <method_specifier>assembly_name.class_name. method_name

Platí pro: SQL Server 2008 (10.0.x) SP 1 a novější verze.

Určuje sestavení a metodu, na kterou se má název vytvořené funkce vztahovat.

  • assembly_name - musí odpovídat hodnotě ve name sloupci SELECT * FROM sys.assemblies;.

    Název, který byl použit v příkazu CREATE ASSEMBLY .

  • class_name - musí odpovídat hodnotě ve assembly_name sloupci SELECT * FROM sys.assembly_modules;.

    Hodnota často obsahuje vloženou tečku nebo tečku. V takových případech syntaxe Transact-SQL vyžaduje, aby byla hodnota ohraničena dvojicí hranatých závorek ([]) nebo dvojicí dvojitých uvozovek ("").

  • method_name - musí odpovídat hodnotě ve method_name sloupci SELECT * FROM sys.assembly_modules;.

    Metoda musí být statická.

V typickém příkladu pro MyFood.dll, ve kterém jsou všechny typy v MyFood oboru názvů, by hodnota EXTERNAL NAME mohla být MyFood.[MyFood.MyClass].MyStaticMethod.

Ve výchozím nastavení SQL Server nemůže spustit kód CLR. Databázové objekty, které odkazují na moduly modulu CLR (Common Language Runtime), můžete vytvářet, upravovat a odstraňovat. Tyto odkazy však nelze spustit v SQL Server, dokud nepovolíte možnost clr povoleno. Chcete-li tuto možnost zapnout, použijte sp_configure. Tato možnost není dostupná v databázi s omezením.

< > table_type_definition ( { column_definition<<> column_constraint | <> computed_column_definition } [ <table_constraint> ] [ , ... n ] )

Definuje datový typ tabulky pro funkci Transact-SQL. Deklarace tabulky obsahuje definice sloupců a omezení sloupců nebo tabulek. Tabulka je vždy umístěna v primární skupině souborů.

< > clr_table_type_definition ( { column_namedata_type } [ , ... n ] )

Platí pro: SQL Server 2008 (10.0.x) SP 1 a novější verze a Azure SQL Database (v některých oblastech Preview).

Definuje datové typy tabulky pro funkci CLR. Deklarace tabulky obsahuje pouze názvy sloupců a datové typy. Tabulka je vždy umístěna v primární skupině souborů.

NULL | NOT NULL

Podporováno pouze pro nativně kompilované, skalární uživatelem definované funkce. Další informace naleznete v tématu Funkce skalárního User-Defined pro In-Memory OLTP.

NATIVE_COMPILATION

Označuje, zda je uživatelem definovaná funkce nativně kompilována. Tento argument je vyžadován pro nativně kompilované, skalární uživatelem definované funkce.

ZAČNĚTE ATOMICKÉ S

Vyžadováno a podporováno pouze pro nativně kompilované skalární uživatelsky definované funkce. Další informace naleznete v tématu Atomické bloky v nativních procedurách.

SCHEMABINDING

Argument SCHEMABINDING je vyžadován pro nativně kompilované, skalární uživatelem definované funkce.

VYKONAT JAKO

EXECUTE AS je vyžadován pro nativně kompilované, skalární uživatelem definované funkce.

< > function_option ::= a <clr_function_option> ::=

Určuje, že funkce má jednu nebo více z následujících možností.

ŠIFROVÁNÍ

Platí pro: SQL Server 2008 (10.0.x) SP 1 a novější verze.

Označuje, že databázový stroj převede původní text CREATE FUNCTION příkazu do zmateného formátu. Výstup obfuskace není přímo viditelný v žádném zobrazení katalogu. Uživatelé, kteří nemají přístup k systémovým tabulkám nebo databázovým souborům, nemohou obfuskovaný text načíst. Text je ale k dispozici privilegovaným uživatelům, kteří mají přístup k systémovým tabulkám přes diagnostické připojení pro správce databází nebo přímo přístup k databázovým souborům. Uživatelé, kteří mohou připojit ladicí program k serverovému procesu, mohou také načíst původní proceduru z paměti za běhu. Další informace o přístupu k systémovým metadatům naleznete v tématu Konfigurace viditelnosti metadat.

Použitím této možnosti zabráníte publikování funkce jako součásti replikace SQL Serveru. Tuto možnost nelze zadat pro funkce CLR.

SCHEMABINDING

Určuje, že funkce je svázána s databázovými objekty, na které odkazuje. Pokud SCHEMABINDING je tato možnost určena, 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 ALTER pomocí příkazu s nespecifikovanou SCHEMABINDING možností.

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

  • Tato funkce je Transact-SQL funkcí.
  • Uživatelem definované funkce a zobrazení, na které funkce odkazuje, jsou také vázány na schéma.
  • Na objekty, na které funkce odkazuje, se odkazuje pomocí názvu se dvěma částmi.
  • Funkce a objekty, na které odkazuje, patří do stejné databáze.
  • Uživatel, který příkaz provedl CREATE FUNCTION , má REFERENCES oprávnění k databázovým objektům, na které funkce odkazuje.

VRÁTÍ HODNOTU NULL PŘI VSTUPU NULL | VOLÁNO NA VSTUPU NULL

Určuje OnNULLCall atribut skalární funkce. Pokud není uvedeno, CALLED ON NULL INPUT je implicitně implikováno. Jinými slovy, tělo funkce se spustí, i když NULL je předáno jako argument.

Pokud RETURNS NULL ON NULL INPUT je ve funkci CLR zadána, znamená to, že SQL Server může vrátit NULL , když některý z obdržených argumentů je NULL, aniž by ve skutečnosti vyvolal tělo funkce. Pokud metoda funkce CLR specifikovaná v <method_specifier> parametru již má vlastní atribut, který označuje RETURNS NULL ON NULL INPUT, ale CREATE FUNCTION příkaz označuje CALLED ON NULL INPUT, má CREATE FUNCTION příkaz přednost. Atribut OnNULLCall nelze zadat pro funkce s hodnotami tabulky CLR.

VYKONAT JAKO

Určuje kontext zabezpečení, ve kterém je uživatelem definovaná funkce vykonána. Proto můžete určit, který uživatelský účet SQL Server použije k ověření oprávnění u všech databázových objektů, na které funkce odkazuje.

EXECUTE AS Nelze zadat pro vložené funkce s hodnotami tabulky.

Další informace naleznete v tématu Klauzule EXECUTE AS (Transact-SQL)).

VLOŽENÝ = { ZAPNUTO | VYPNUTO }

Platí pro: SQL Server 2019 (15.x) a novější verze a Azure SQL Database.

Určuje, zda má být tento skalární UDF vložený nebo ne. Tato klauzule se vztahuje pouze na skalární uživatelem definované funkce. Klauzule INLINE není povinná. Pokud klauzule INLINE není zadaná, automaticky se nastaví na ON nebo OFF na základě toho, jestli je UDF vložený. Pokud INLINE = ON je zadáno, ale systém souborů UDF je shledán jako nevložitelný, je vyvolána chyba. Další informace najdete v tématu Inlining skalárních funkcí definované uživatelem.

< > column_definition ::=

Definuje datový typ tabulky. Deklarace tabulky obsahuje definice sloupců a omezení. U funkcí CLR lze zadat pouze column_name a data_type .

column_name

Název sloupce v tabulce. Názvy sloupců musí splňovat pravidla pro identifikátory a musí být v tabulce jedinečné. column_name může obsahovat 1 až 128 znaků.

data_type

Určuje datový typ sloupce. U funkcí Transact-SQL jsou povoleny všechny datové typy, včetně uživatelsky definovaných typů CLR, s výjimkou časového razítka. U funkcí CLR jsou povoleny všechny datové typy, včetně uživatelsky definovaných typů CLR, s výjimkou textu, ntextu, obrázku, char, varchar, varchar(max) a časového razítka. Kurzor neskalárního typu nelze zadat jako datový typ sloupce ve funkcích Transact-SQL ani CLR.

VÝCHOZÍ constant_expression

Určuje hodnotu zadanou pro sloupec, pokud hodnota není explicitně zadána během vložení. constant_expression je konstanta, NULLnebo hodnota systémové funkce. DEFAULT Definice lze použít na libovolný sloupec s výjimkou těch, které mají danou IDENTITY vlastnost. DEFAULT nelze zadat pro funkce s hodnotami tabulky CLR.

COLLATION_NAME COLLATE

Určuje kolaci sloupce. Pokud není uvedeno, sloupci je přiřazeno výchozí řazení databáze. Název kolace může být buď název kolace Systému Windows, nebo název kolace SQL. Seznam a další informace o řazení naleznete v tématech Název řazení systému Windows (Transact-SQL) a Název řazení serveru SQL Server (Transact-SQL)).

Klauzuli COLLATE lze použít ke změně řazení pouze sloupců datových typů char, varchar, nchar a nvarchar . COLLATE nelze zadat pro funkce s hodnotami tabulky CLR.

ROWGUIDCOL

Označuje, že nový sloupec je sloupec globálně jedinečného identifikátoru řádku. Jako sloupec lze označit ROWGUIDCOL pouze jeden sloupec uniqueidentifier na tabulku. Vlastnost ROWGUIDCOL lze přiřadit pouze ke sloupci uniqueidentifier .

Tato ROWGUIDCOL vlastnost nevynucuje jedinečnost hodnot uložených ve sloupci. Také negeneruje automaticky hodnoty pro nové řádky vložené do tabulky. Chcete-li vygenerovat jedinečné hodnoty pro každý sloupec, použijte NEWID funkci on INSERT příkazy. Lze zadat výchozí hodnotu; NEWID nelze jej však zadat jako výchozí.

IDENTITA

Označuje, že nový sloupec je sloupec identity. Když je do tabulky přidán nový řádek, SQL Server poskytuje pro sloupec jedinečnou přírůstkovou hodnotu. Sloupce identity se obvykle používají společně s PRIMARY KEY omezeními, aby sloužily jako jedinečný identifikátor řádku pro tabulku. Vlastnost IDENTITY lze přiřadit sloupcům tinyint, smallint, int, bigint, decimal(p,0) nebo numeric(p,0). Pro každou tabulku je možné vytvořit pouze jeden sloupec identity. Vázané výchozí hodnoty a DEFAULT omezení nelze použít se sloupcem identity. Musíte určit jak počáteční hodnotu , tak přírůstek nebo ani jedno. Pokud není zadán žádný z nich, výchozí hodnota je (1,1).

IDENTITY nelze zadat pro funkce s hodnotami tabulky CLR.

semeno

Celočíselná hodnota, která má být přiřazena prvnímu řádku v tabulce.

přírůstek

Celočíselná hodnota, která se má přičíst k počáteční hodnotě pro následující řádky v tabulce.

< > column_constraint ::= a <table_constraint> ::=

Definuje omezení pro určený sloupec nebo tabulku. Pro funkce CLR je NULLjediným povoleným typem omezení . Pojmenovaná omezení nejsou povolena.

NULL | NOT NULL

Určuje, zda jsou ve sloupci povoleny hodnoty null. NULL není striktně omezením, ale lze jej zadat stejně jako NOT NULL. NOT NULL nelze zadat pro funkce s hodnotami tabulky CLR.

PRIMÁRNÍ KLÍČ

Omezení, které vynucuje integritu entity pro zadaný sloupec prostřednictvím jedinečného indexu. Ve funkcích definovaných uživatelem s hodnotami PRIMARY KEY tabulky lze omezení vytvořit pouze pro jeden sloupec v tabulce. PRIMARY KEY nelze zadat pro funkce s hodnotami tabulky CLR.

JEDINEČNÝ

Omezení, které poskytuje integritu entity pro zadaný sloupec nebo sloupce prostřednictvím jedinečného indexu. Tabulka může mít více UNIQUE omezení. UNIQUE nelze zadat pro funkce s hodnotami tabulky CLR.

CLUSTERED | NECLUSTERED

Označuje, že pro omezení or UNIQUE je vytvořen clusterovaný nebo neclusterovaný index.PRIMARY KEY PRIMARY KEYpoužití omezení a CLUSTEREDUNIQUE použití omezení .NONCLUSTERED

CLUSTERED lze zadat pouze pro jedno omezení. Pokud CLUSTERED je zadáno pro UNIQUE omezení a je také zadáno omezeníPRIMARY KEY, použije NONCLUSTEREDse PRIMARY KEY .

CLUSTERED a NONCLUSTERED nelze je zadat pro funkce CLR s hodnotami tabulky.

ZKONTROLUJ

Omezení, které vynucuje integritu domény omezením možných hodnot, které lze zadat do sloupce nebo sloupců. CHECK Omezení nelze zadat pro funkce s hodnotou tabulky CLR.

logical_expression

Logický výraz, který vrací TRUE nebo FALSE.

< > computed_column_definition ::=

Určuje počítaný sloupec. Další informace o počítaných sloupcích naleznete v tématu CREATE TABLE (Transact-SQL).

column_name

Název počítaného sloupce.

computed_column_expression

Výraz, který definuje hodnotu počítaného sloupce.

< > index_option ::=

Určuje volby rejstříku pro rejstřík PRIMARY KEY nebo UNIQUE . Další informace o volbách rejstříku naleznete v tématu CREATE INDEX (Transact-SQL).

PAD_INDEX = { ON | VYPNUTO }

Určuje odsazení indexu. Výchozí hodnota je OFF.

FILLFACTOR = fillfactor

Určuje procentuální hodnotu, která udává, jak by měl databázový stroj zaplnit listovou úroveň každé stránky indexu během vytváření nebo změny indexu. fillfactor musí být celočíselná hodnota od 1 do 100. Výchozí hodnota je 0.

IGNORE_DUP_KEY = { ON | VYPNUTO }

Určuje chybovou odpověď, když se operace vložení pokusí vložit duplicitní hodnoty klíče do jedinečného indexu. Možnost IGNORE_DUP_KEY se vztahuje pouze na operace vložení po vytvoření nebo vytvoření indexu. Výchozí hodnota je OFF.

STATISTICS_NORECOMPUTE = { ON | VYPNUTO }

Určuje, zda se přepočítávají statistiky distribuce. Výchozí hodnota je OFF.

ALLOW_ROW_LOCKS = { ON | VYPNUTO }

Určuje, jestli jsou povolené zámky řádků. Výchozí hodnota je ON.

ALLOW_PAGE_LOCKS = { ON | VYPNUTO }

Určuje, jestli jsou povolené zámky stránek. Výchozí hodnota je ON.

Osvědčené postupy

Pokud není vytvořena uživatelem definovaná funkce s klauzulí SCHEMABINDING , změny provedené v podkladových objektech mohou ovlivnit definici funkce a při jejím vyvolání vést neočekávané výsledky. Doporučujeme implementovat jednu z následujících metod, abyste zajistili, že funkce nebude zastaralá kvůli změnám jeho podkladových objektů:

  • Klauzuli určete WITH SCHEMABINDING při vytváření funkce. Tato volba zajistí, že objekty, na které se odkazuje v definici funkce, nebude možné změnit, pokud se nezmění také funkce.

  • Uloženou proceduru sp_refreshsqlmodule spusťte po úpravě libovolného objektu, který je specifikován v definici funkce.

Další informace a informace o výkonu vložených funkcí s hodnotou tabulky (vložené TVF) a vícepříkazových funkcí s hodnotami tabulky (MSTVF) naleznete v tématu Vytváření uživatelsky definovaných funkcí (databázový stroj).

Datové typy

Pokud jsou ve funkci CLR zadány parametry, mělo by se jednat o typy SQL Server, jak bylo definováno dříve pro scalar_parameter_data_type. Další informace o porovnání systémových datových typů SQL Server s datovými typy integrace CLR nebo datovými typy modulu CLR (Common Language Runtime) rozhraní .NET Framework naleznete v tématu Mapování dat parametrů CLR.

Aby SQL Server odkazoval na správnou metodu, když je ve třídě přetížena, musí mít metoda uvedená v části <method_specifier> následující charakteristiky:

  • Získejte stejný počet parametrů, jaký je uveden v .[ , ...n ]
  • Získejte všechny parametry podle hodnoty, nikoli podle odkazu.
  • Používejte typy parametrů, které jsou kompatibilní s typy určenými ve funkci SQL Server.

Pokud návratový datový typ funkce CLR určuje typ tabulky (RETURNS TABLE), návratový datový typ metody in <method_specifier> by měl být typu IEnumerator nebo IEnumerable, a předpokládá, že rozhraní je implementováno tvůrcem funkce. Na rozdíl od funkcí Transact-SQL nemohou funkce CLR obsahovat PRIMARY KEYomezení , UNIQUEnebo CHECK v <table_type_definition>. Datové typy sloupců specifikované v části <table_type_definition> se musí shodovat s typy odpovídajících sloupců sady výsledků dotazu vrácené metodou v <method_specifier> době provádění. Tato kontrola typu se neprovádí v době vytvoření funkce.

Další informace o tom, jak programovat funkce CLR, naleznete v tématu CLR User-Defined Functions.

Poznámky

Skalární funkce lze vyvolat tam, kde se používají skalární výrazy, což zahrnuje počítané sloupce a CHECK definice omezení. Skalární funkce lze také provádět pomocí příkazu EXECUTE (Transact-SQL). Skalární funkce musí být vyvolány alespoň názvem dvoudílné funkce (<schema>.<function>). Další informace o názvech s více částmi naleznete v tématu Transact-SQL Syntax Conventions (Transact-SQL). Funkce vracející tabulku lze vyvolat tam, kde jsou výrazy tabulky povoleny v FROM klauzuli příkazů SELECT, INSERT, UPDATE, nebo DELETE . Další informace naleznete v tématu Spouštění uživatelsky definovaných funkcí.

Interoperabilita

Ve funkci jsou platné následující příkazy:

  • Příkazy přiřazení.
  • Příkazy řízení toku kromě TRY...CATCH příkazů.
  • DECLARE definující lokální datové proměnné a lokální kurzory.
  • SELECT Příkazy, které obsahují seznamy SELECT s výrazy, které přiřazují hodnoty místním proměnným.
  • Operace s kurzory odkazující na místní kurzory, které jsou deklarovány, otevírány, zavírány a rušeny ve funkci. Povoleny jsou pouze FETCH příkazy, které přiřazují hodnoty lokálním proměnným pomocí INTO klauzule; FETCH příkazy, které vracejí data klientovi, nejsou povoleny.
  • INSERT, UPDATEa DELETE příkazy upravující proměnné místní tabulky.
  • EXECUTE volání rozšířených uložených procedur.

Další informace naleznete v tématu Vytváření uživatelsky definovaných funkcí (databázový stroj).

Interoperabilita počítaných sloupců

Funkce mají následující vlastnosti. Hodnoty těchto vlastností určují, zda lze funkce použít ve vypočítaných sloupcích, které lze zachovat nebo indexovat.

Vlastnictví Popis Poznámky
IsDeterministic Funkce je deterministická nebo nedeterministická. Lokální přístup k datům je povolen v deterministických funkcích. Například funkce, které vždy vracejí stejný výsledek, kdykoli jsou volány pomocí určité sady vstupních hodnot a se stejným stavem databáze, by byly označeny jako deterministické.
IsPrecise Funkce je přesná nebo nepřesná. Nepřesné funkce obsahují operace, jako jsou operace s plovoucí desetinnou čárkou.
IsSystemVerified Přesnost a deterministické vlastnosti funkce mohou být ověřeny SQL Serverem.
SystemDataAccess Funkce přistupuje k systémovým datům (systémovým katalogům nebo virtuálním systémovým tabulkám) v lokální instanci SQL Serveru.
UserDataAccess Funkce přistupuje k uživatelským datům v lokální instanci SQL Serveru. Zahrnuje uživatelem definované tabulky a dočasné tabulky, ale ne proměnné tabulky.

Vlastnosti přesnosti a determinismu Transact-SQL funkcí jsou automaticky určeny serverem SQL Server. Přístup k datům a vlastnosti determinismu funkcí CLR mohou být specifikovány uživatelem. Další informace naleznete v tématu Integrace CLR: vlastní atributy pro rutiny CLR.

Chcete-li zobrazit aktuální hodnoty těchto vlastností, použijte příkaz OBJECTPROPERTYEX (Transact-SQL).

Důležité

Funkce musí být vytvořeny s SCHEMABINDING , aby byly deterministické.

Počítaný sloupec, který vyvolá uživatelem definovanou funkci, lze použít v indexu, pokud má uživatelem definovaná funkce následující hodnoty vlastností:

  • IsDeterministic je true
  • IsSystemVerified is true (pokud není počítaný sloupec trvalý)
  • UserDataAccess je false
  • SystemDataAccess je false

Další informace najdete v tématu Indexy ve vypočítaných sloupcích.

Volání rozšířených uložených procedur z funkcí

Rozšířená uložená procedura při volání zevnitř funkce nemůže vrátit sady výsledků dotazu klientovi. Všechna rozhraní ODS API, která vracejí sady výsledků klientovi, vrátí FAIL. Rozšířená uložená procedura se může připojit zpět k instanci SQL Server. Neměl by se ale pokoušet spojit stejnou transakci jako funkce, která vyvolala rozšířenou uloženou proceduru.

Podobně jako u vyvolání z dávkové nebo uložené procedury je rozšířená uložená procedura spuštěna v kontextu účtu zabezpečení systému Windows, pod kterým je spuštěn SQL Server. Vlastník uložené procedury by měl tento scénář zvážit při udělování EXECUTE oprávnění uživatelům.

Omezení

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

Uživatelem definované funkce nemůžou obsahovat klauzuli OUTPUT INTO, která má jako cíl tabulku.

Následující příkazy Service Broker nelze zahrnout do definice Transact-SQL uživatelem definované funkce:

  • BEGIN DIALOG CONVERSATION
  • END CONVERSATION
  • GET CONVERSATION GROUP
  • MOVE CONVERSATION
  • RECEIVE
  • SEND

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 je možné vnořit až do 32 úrovní. Překročení maximální úrovně vnoření způsobí selhání celého řetězce volaných funkcí. Všechny odkazy na spravovaný kód ze Transact-SQL uživatelem definované funkce se počítají jako jedna úroveň oproti limitu vnoření na úrovni 32. Metody vyvolané z spravovaného kódu se do tohoto limitu nezapočítávají.

Použití pořadí řazení ve funkcích CLR s hodnotou tabulky

Při použití klauzule ORDER ve funkcích CLR s hodnotou tabulky postupujte podle těchto pokynů:

  • Musíte zajistit, aby byly výsledky vždy seřazeny v určeném pořadí. Pokud výsledky nejsou v zadaném pořadí, SQL Server při spuštění dotazu vygeneruje chybovou zprávu.

  • ORDER Pokud je zadána klauzule, výstup funkce vracející tabulku musí být seřazen podle řazení sloupce (explicitního nebo implicitního). Pokud je například řazení sloupců v čínštině, musí být vrácené výsledky seřazeny podle čínských pravidel řazení. (Řazení je určeno buď v DDL pro funkci s hodnotou tabulky, nebo je získáno z databázového kolace.)

  • SQL Server vždy ověří ORDER klauzuli, pokud je zadána, a při vrácení výsledků bez ohledu na to, zda ji procesor dotazů používá k provádění dalších optimalizací. Klauzuli používejte ORDER pouze v případě, že víte, že je užitečná pro procesor dotazů.

  • Procesor dotazů SQL Serveru využívá klauzuli ORDER automaticky v následujících případech:

    • Vložte dotazy, kde ORDER je klauzule kompatibilní s indexem.
    • ORDER BY doložky, které jsou s danou doložkou ORDER slučitelné.
    • Agregáty, kde GROUP BY je kompatibilní s ORDER klauzulí.
    • DISTINCT agregace, kde jsou jednotlivé sloupce kompatibilní s klauzulí ORDER .

Tato ORDER klauzule nezaručuje seřazené výsledky při spuštění dotazu SELECT , pokud ORDER BY není v dotazu také uvedena. Viz sys.function_order_columns (Transact-SQL) informace o tom, jak dotazovat na sloupce zahrnuté v pořadí řazení pro funkce hodnotící tabulku.

Metadatové údaje

V následující tabulce jsou uvedena zobrazení systémového katalogu, která můžete použít k vrácení metadat o uživatelem definovaných funkcích.

Systémové zobrazení Popis
sys.sql_moduly Viz příklad E v části Příklady.
sys.assembly_modules Zobrazuje informace o uživatelsky definovaných funkcích CLR.
sys.parameters Zobrazuje informace o parametrech definovaných v uživatelsky definovaných funkcích.
závislosti_výrazu_sys.sql Zobrazí spodní objekty, na které odkazuje funkce.

Dovolení

Vyžaduje oprávnění CREATE FUNCTION v databázi a ALTER oprávnění ke schématu, ve kterém se funkce vytváří. Pokud funkce určuje typ definovaný uživatelem, vyžaduje EXECUTE oprávnění k typu.

Příklady

Další příklady a aspekty výkonu UDF najdete v tématu Vytváření uživatelsky definovaných funkcí (databázový stroj).

A. Použití uživatelem definované funkce se skalární hodnotou, která vypočítá týden ISO

Následující příklad vytvoří uživatelem definovanou funkci ISOweek. Tato funkce přebírá argument data a vypočítá číslo týdne podle ISO. Aby se tato funkce vypočítala správně, SET DATEFIRST 1 musí být vyvolána před jejím voláním.

Příklad také ukazuje použití klauzule EXECUTE AS (Transact-SQL) k určení kontextu zabezpečení, ve kterém lze uloženou proceduru spustit. V příkladu tato možnost CALLER určuje, že procedura je provedena v kontextu uživatele, který ji volá. Další možnosti, které můžete zadat, jsou SELF, OWNERa user_name.

Zde je volání funkce. DATEFIRST je nastaveno na 1.

CREATE FUNCTION dbo.ISOweek (@DATE DATETIME)
RETURNS INT
WITH EXECUTE AS CALLER
AS
BEGIN
    DECLARE @ISOweek INT;

    SET @ISOweek = DATEPART(wk, @DATE) + 1 -
        DATEPART(wk, CAST(DATEPART(yy, @DATE) AS CHAR(4)) + '0104');

    --Special cases: Jan 1-3 may belong to the previous year
    IF (@ISOweek = 0)
        SET @ISOweek = dbo.ISOweek(CAST(DATEPART(yy, @DATE) - 1 AS CHAR(4))
           + '12' + CAST(24 + DATEPART(DAY, @DATE) AS CHAR(2))) + 1;

    --Special case: Dec 29-31 may belong to the next year
    IF ((DATEPART(mm, @DATE) = 12)
        AND ((DATEPART(dd, @DATE) - DATEPART(dw, @DATE)) >= 28))
    SET @ISOweek = 1;

    RETURN (@ISOweek);
END;
GO

SET DATEFIRST 1;

SELECT dbo.ISOweek(CONVERT(DATETIME, '12/26/2004', 101)) AS 'ISO Week';

Tady je soubor výsledků.

ISO Week
----------------
52

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

Následující příklad vrátí vloženou funkci s hodnotou tabulky v databázi AdventureWorks2022. Vrátí tři sloupce ProductID, Namea souhrn součtů od začátku roku podle obchodu pro YTD Total každý produkt prodaný do obchodu.

CREATE FUNCTION Sales.ufn_SalesByStore (@storeid INT)
RETURNS TABLE
AS
RETURN (
    SELECT P.ProductID, P.Name, SUM(SD.LineTotal) AS 'Total'
    FROM Production.Product AS P
    INNER JOIN Sales.SalesOrderDetail AS SD ON SD.ProductID = P.ProductID
    INNER JOIN Sales.SalesOrderHeader AS SH ON SH.SalesOrderID = SD.SalesOrderID
    INNER JOIN Sales.Customer AS C ON SH.CustomerID = C.CustomerID
    WHERE C.StoreID = @storeid
    GROUP BY P.ProductID, P.Name
);
GO

Chcete-li funkci vyvolat, spusťte tento dotaz.

SELECT * FROM Sales.ufn_SalesByStore (602);

C. Vytvoření funkce s více příkazy hodnotící tabulku

Následující příklad vytvoří funkci fn_FindReports(InEmpID) s hodnotou tabulky v AdventureWorks2022 databázi. Pokud je funkce zadána s platným ID zaměstnance, vrátí tabulku, která odpovídá všem zaměstnancům, kteří jsou zaměstnanci přímo nebo nepřímo podřízeni. Funkce používá rekurzivní výraz Common Table (CTE) k vytvoření hierarchického seznamu zaměstnanců. Další informace o rekurzivních tabulkách CTE naleznete v tématu S common_table_expression (Transact-SQL)).

CREATE FUNCTION dbo.ufn_FindReports (@InEmpID INT)
RETURNS @retFindReports TABLE (
    EmployeeID INT PRIMARY KEY NOT NULL,
    FirstName NVARCHAR(255) NOT NULL,
    LastName NVARCHAR(255) NOT NULL,
    JobTitle NVARCHAR(50) NOT NULL,
    RecursionLevel INT NOT NULL
    )
    --Returns a result set that lists all the employees who report to the
    --specific employee directly or indirectly.
AS
BEGIN
    WITH EMP_cte (
        EmployeeID,
        OrganizationNode,
        FirstName,
        LastName,
        JobTitle,
        RecursionLevel
        ) -- CTE name and columns
    AS (
        -- Get the initial list of Employees for Manager n
        SELECT e.BusinessEntityID,
            OrganizationNode = ISNULL(e.OrganizationNode, CAST('/' AS HIERARCHYID)),
            p.FirstName,
            p.LastName,
            e.JobTitle,
            0
        FROM HumanResources.Employee e
        INNER JOIN Person.Person p
            ON p.BusinessEntityID = e.BusinessEntityID
        WHERE e.BusinessEntityID = @InEmpID
        
        UNION ALL
        
        -- Join recursive member to anchor
        SELECT e.BusinessEntityID,
            e.OrganizationNode,
            p.FirstName,
            p.LastName,
            e.JobTitle,
            RecursionLevel + 1
        FROM HumanResources.Employee e
        INNER JOIN EMP_cte
            ON e.OrganizationNode.GetAncestor(1) = EMP_cte.OrganizationNode
        INNER JOIN Person.Person p
            ON p.BusinessEntityID = e.BusinessEntityID
        )
    -- Copy the required columns to the result of the function
    INSERT @retFindReports
    SELECT EmployeeID,
        FirstName,
        LastName,
        JobTitle,
        RecursionLevel
    FROM EMP_cte

    RETURN
END;
GO

-- Example invocation
SELECT EmployeeID,
    FirstName,
    LastName,
    JobTitle,
    RecursionLevel
FROM dbo.ufn_FindReports(1);
GO

D. Vytvoření funkce CLR

Příklad vytvoří funkci len_sCLR . Před vytvořením funkce je sestavení SurrogateStringFunction.dll zaregistrováno v lokální databázi.

Platí pro: SQL Server 2008 (10.0.x) SP 1 a novější verze.

DECLARE @SamplesPath NVARCHAR(1024);

-- You may have to modify the value of this variable if you have
-- installed the sample in a location other than the default location.
SELECT @SamplesPath = REPLACE(physical_name,
    'Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\master.mdf',
    'Microsoft SQL Server\130\Samples\Engine\Programmability\CLR\'
)
FROM master.sys.database_files
WHERE name = 'master';

CREATE ASSEMBLY [SurrogateStringFunction]
FROM @SamplesPath + 'StringManipulate\CS\StringManipulate\bin\debug\SurrogateStringFunction.dll'
    WITH PERMISSION_SET = EXTERNAL_ACCESS;
GO

CREATE FUNCTION [dbo].[len_s] (@str NVARCHAR(4000))
RETURNS BIGINT
AS
EXTERNAL NAME [SurrogateStringFunction].[Microsoft.Samples.SqlServer.SurrogateStringFunction].[LenS];
GO

Příklad vytvoření funkce s hodnotou tabulky CLR naleznete v tématu Funkce CLR Table-Valued.

E. Zobrazit definici uživatelsky definovaných funkcí

SELECT DEFINITION,
    type
FROM sys.sql_modules AS m
INNER JOIN sys.objects AS o
    ON m.object_id = o.object_id
    AND type IN ('FN', 'IF', 'TF');
GO

Definici funkcí vytvořených pomocí této ENCRYPTION možnosti nelze zobrazit pomocí ; sys.sql_moduleszobrazí se však jiné informace o šifrovaných funkcích.