Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro:SQL Server
Azure SQL Database
azure 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).
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
sloupciSELECT * FROM sys.assemblies;
.Název, který byl použit v příkazu
CREATE ASSEMBLY
.class_name - musí odpovídat hodnotě ve
assembly_name
sloupciSELECT * 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
sloupciSELECT * 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 nespecifikovanouSCHEMABINDING
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, NULL
nebo 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 NULL
jediný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 KEY
použití omezení a CLUSTERED
UNIQUE
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 NONCLUSTERED
se 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 KEY
omezení , UNIQUE
nebo 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
,UPDATE
aDELETE
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
jetrue
-
IsSystemVerified
istrue
(pokud není počítaný sloupec trvalý) -
UserDataAccess
jefalse
-
SystemDataAccess
jefalse
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žívejteORDER
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žkouORDER
slučitelné. - Agregáty, kde
GROUP BY
je kompatibilní sORDER
klauzulí. -
DISTINCT
agregace, kde jsou jednotlivé sloupce kompatibilní s klauzulíORDER
.
- Vložte dotazy, kde
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
, OWNER
a 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
, Name
a 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_s
CLR . 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_modules
zobrazí se však jiné informace o šifrovaných funkcích.
Související obsah
- vytvoření uživatelem definovaných funkcí (databázový stroj)
- ALTER FUNKCE (Transact-SQL)
- funkce DROP (Transact-SQL)
- OBJECTPROPERTYEX (Transact-SQL)
- sys.sql_moduly (Transact-SQL)
- sys.assembly_modules (Transact-SQL)
- EXECUTE (Transact-SQL)
- Funkce CLR User-Defined
- EVENTDATA (Transact-SQL)
- VYTVOŘTE ZÁSADY ZABEZPEČENÍ (Transact-SQL)