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
SQL databáze v Microsoft Fabric
Vytvoří datový typ aliasu nebo uživatelem definovaný typ v aktuální databázi v SQL Serveru nebo Azure SQL Database. Implementace datového typu alias je založená na nativním systémovém typu databázového stroje. Uživatelem definovaný typ se implementuje prostřednictvím třídy sestavení v modulu CLR (Common Language Runtime) rozhraní Microsoft .NET Framework. Chcete-li vytvořit vazbu uživatelem definovaného typu k jeho implementaci, musí být sestavení CLR obsahující implementaci typu nejprve registrováno v databázovém stroji pomocí CREATE ASSEMBLY.
Možnost spouštět kód CLR je ve výchozím nastavení na SQL Serveru vypnutá. Databázové objekty, které odkazují na moduly spravovaného kódu, můžete vytvářet, upravovat a odstraňovat. Tyto odkazy se ale nespouštějí na SQL Serveru, pokud není povolená možnost clr pomocí sp_configure.
Note
Integrace .NET Framework CLR do SQL Server je popsána v tomto článku. Integrace CLR se nevztahuje na Azure SQL Database ani SQL databáze v Microsoft Fabric, kde nejsou podporovány typy CLR (.NET).
Syntax
Syntaxe datového typu definovaná uživatelem:
CREATE TYPE [ schema_name. ] type_name
{
FROM base_type
[ ( precision [ , scale ] ) ]
[ NULL | NOT NULL ]
| EXTERNAL NAME assembly_name [ .class_name ]
| AS TABLE ( { <column_definition> | <computed_column_definition> [ , ...n ]
[ <table_constraint> ] [ , ...n ]
[ <table_index> ] [ , ...n ] } )
} [ ; ]
<column_definition> ::=
column_name <data_type>
[ COLLATE collation_name ]
[ NULL | NOT NULL ]
[
DEFAULT constant_expression ]
| [ IDENTITY [ ( seed , increment ) ]
]
[ ROWGUIDCOL ] [ <column_constraint> [ ...n ] ]
<data type> ::=
[ type_schema_name . ] type_name
[ ( precision [ , scale ] | max |
[ { CONTENT | DOCUMENT } ] xml_schema_collection ) ]
<column_constraint> ::=
{ { PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
[
WITH ( <index_option> [ , ...n ] )
]
| CHECK ( logical_expression )
}
<computed_column_definition> ::=
column_name AS computed_column_expression
[ PERSISTED [ NOT NULL ] ]
[
{ PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
[
WITH ( <index_option> [ , ...n ] )
]
| CHECK ( logical_expression )
]
<table_constraint> ::=
{
{ PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
( column [ ASC | DESC ] [ , ...n ] )
[
WITH ( <index_option> [ , ...n ] )
]
| CHECK ( logical_expression )
}
<index_option> ::=
{
IGNORE_DUP_KEY = { ON | OFF }
}
< table_index > ::=
INDEX index_name
[ CLUSTERED | NONCLUSTERED ] (column [ ASC | DESC ] [ , ...n ] )
[INCLUDE (column, ...n)]
Syntaxe typů tabulek optimalizovaných uživatelem definovaných pro paměť:
CREATE TYPE [ schema_name. ] type_name
AS TABLE ( { <column_definition> [ , ...n ] }
| [ <table_constraint> ] [ , ...n ]
| [ <table_index> ] [ , ...n ] )
[ WITH ( <table_option> [ , ...n ] ) ]
[ ; ]
<column_definition> ::=
column_name <data_type>
[ COLLATE collation_name ] [ NULL | NOT NULL ]
[ IDENTITY [ (1 , 1) ]
]
[ <column_constraint> [ , ...n ] ] [ <column_index> ]
<data type> ::=
[ type_schema_name . ] type_name [ ( precision [ , scale ] ) ]
<column_constraint> ::=
{ PRIMARY KEY { NONCLUSTERED HASH WITH ( BUCKET_COUNT = bucket_count )
| NONCLUSTERED }
}
< table_constraint > ::=
{ PRIMARY KEY { NONCLUSTERED HASH (column [ , ...n ] )
WITH ( BUCKET_COUNT = bucket_count )
| NONCLUSTERED ( column [ ASC | DESC ] [ , ...n ] )
}
}
<column_index> ::=
INDEX index_name
{ [ NONCLUSTERED ] HASH (column [ , ...n ] ) WITH ( BUCKET_COUNT = bucket_count )
| NONCLUSTERED ( column [ ASC | DESC ] [ , ...n ] )
}
< table_index > ::=
INDEX index_name
{ [ NONCLUSTERED ] HASH (column [ , ...n ] ) WITH ( BUCKET_COUNT = bucket_count )
| [ NONCLUSTERED ] ( column [ ASC | DESC ] [ , ...n ] )
}
<table_option> ::=
{
[ MEMORY_OPTIMIZED = { ON | OFF } ]
}
Arguments
schema_name
Název schématu, do kterého patří datový typ aliasu nebo uživatelem definovaný typ.
type_name
Název datového typu aliasu nebo uživatelem definovaného typu. Názvy typů musí splňovat pravidla pro identifikátory.
base_type
Databázový stroj zadal datový typ, na kterém je datový typ aliasu založen. base_type je sysname bez výchozího nastavení a může to být jedna z následujících hodnot:
- bigint, int, smallint a tinyint
- binary(n), varbinary(n) a varbinary(max)
- bit
- char(n), nchar(n), nvarchar(n), nvarchar(max), varchar(n)a varchar(max)
- date, datetime, datetime2, datetimeoffset, smalldatetime a time
- desetinná a číselná
- float a real
- image
- peníze a malé peníze
- sql_variant
- text a ntext
- uniqueidentifier
base_type může být také synonymem datového typu, které se mapují na jeden z těchto systémových datových typů.
precision
V případě desítkového nebo číselného čísla je přesnost nezáporné celé číslo označující maximální celkový počet desetinných míst, které lze uložit, a to jak vlevo, tak vpravo od desetinné čárky. Další informace naleznete v desetinných číslech (Transact-SQL).
scale
U desetinných nebo čísel je měřítko nezáporné celé číslo, které označuje maximální počet desetinných číslic, které lze uložit napravo od desetinné čárky, a musí být menší než nebo rovno přesnosti. Další informace naleznete v desetinných číslech (Transact-SQL).
NULL | NE NULL
Určuje, zda typ může obsahovat hodnotu null. Pokud není zadáno, NULL je výchozí hodnota.
assembly_name
Platí pro: SQL Server
Určuje sestavení SQL Serveru, které odkazuje na implementaci uživatelem definovaného typu v modulu CLR (Common Language Runtime). assembly_name by se mělo shodovat s existujícím sestavením v SQL Serveru v aktuální databázi.
Note
EXTERNAL_NAME není k dispozici v databázi s omezením.
[ . class_name ]
Platí pro: SQL Server
Určuje třídu v sestavení, která implementuje uživatelem definovaný typ. class_name musí být platný identifikátor a musí existovat jako třída v sestavení s viditelností sestavení. class_name rozlišují malá a velká písmena bez ohledu na kolaci databáze a musí přesně odpovídat názvu třídy v odpovídajícím sestavení. Název třídy může být kvalifikovaný název oboru názvů uzavřený v hranatých závorkách ([ ]), pokud programovací jazyk, který se používá k zápisu třídy, používá koncept oborů názvů, například C#. Pokud class_name nezadáte, SQL Server předpokládá, že je stejný jako type_name.
<column_definition>
Definuje sloupce pro uživatelem definovaný typ tabulky.
<datový typ>
Definuje datový typ ve sloupci pro uživatelem definovaný typ tabulky. Další informace o datových typech naleznete v tématu Datové typy (Transact-SQL). Další informace o tabulkách naleznete v tématu CREATE TABLE (Transact-SQL).
<column_constraint>
Definuje omezení sloupců pro uživatelem definovaný typ tabulky. Mezi podporovaná omezení patří PRIMARY KEY, UNIQUEa CHECK. Další informace o tabulkách naleznete v tématu CREATE TABLE (Transact-SQL).
<computed_column_definition>
Definuje počítaný sloupcový výraz jako sloupec v uživatelem definovaném typu tabulky. Další informace o tabulkách naleznete v tématu CREATE TABLE (Transact-SQL).
<table_constraint>
Definuje omezení tabulky u uživatelem definovaného typu tabulky. Mezi podporovaná omezení patří PRIMARY KEY, UNIQUEa CHECK.
<index_option>
Určuje chybovou odpověď na duplicitní hodnoty klíče v operaci vložení více řádků v jedinečném clusteru nebo jedinečném neclusterovaného indexu. Další informace o volbách rejstříku naleznete v tématu CREATE INDEX (Transact-SQL).
INDEX index_name [ CLUSTERED | NONCLUSTERED ] ( column_name [ ASC | DESC ] [ , ... n ] )
Platí pro: SQL Server 2014 (12.x) a novější verze, Azure SQL Database a Azure SQL Managed Instance.
Určuje vytvoření indexu v tabulce. Může se jednat o clusterovaný index nebo neclusterovaný index. Index obsahuje sloupce uvedené a seřadí data vzestupně nebo sestupně.
INDEX
Jako součást CREATE TABLE příkazu je nutné zadat indexy sloupců a tabulek.
CREATE INDEX a DROP INDEX nejsou podporovány pro tabulky optimalizované pro paměť.
MEMORY_OPTIMIZED
Platí pro: SQL Server 2014 (12.x) a novější verze, Azure SQL Database a Azure SQL Managed Instance. Spravovaná instance Azure SQL nepodporuje tabulky optimalizované pro paměť na úrovni Pro obecné účely.
Určuje, zda je typ tabulky optimalizován pro paměť. Tato možnost je ve výchozím nastavení vypnutá; tabulka (typ) není tabulka optimalizovaná pro paměť (typ). Typy tabulek optimalizovaných pro paměť jsou tabulky uživatelů optimalizované pro paměť, což je schéma, které je trvalé na disku podobné jiným uživatelským tabulkám.
BUCKET_COUNT
Platí pro: SQL Server 2014 (12.x) a novější verze, Azure SQL Database, Azure SQL Database a Azure SQL Managed Instance.
Určuje počet kbelíků, které by se měly vytvořit v indexu hash. Maximální hodnota BUCKET_COUNT indexů hash je 1 073 741 824. Další informace o počtech kontejnerů najdete v tématu Indexy v tabulkách Memory-Optimized.
bucket_count je povinný argument.
HASH
Platí pro: SQL Server 2014 (12.x) a novější verze, Azure SQL Database, Azure SQL Database a Azure SQL Managed Instance.
Označuje, že HASH se vytvoří index. Indexy hash jsou podporovány pouze u tabulek optimalizovaných pro paměť.
Remarks
Třída sestavení, která je odkazována v assembly_name společně s jeho metodami, by měla splňovat všechny požadavky pro implementaci uživatelem definovaného typu v SQL Serveru. Další informace o těchto User-Defined požadavch
Mezi další aspekty patří:
Třída může obsahovat přetížené metody, ale tyto metody lze volat pouze ze spravovaného kódu, nikoli z Jazyka Transact-SQL.
Všechny statické členy musí být deklarovány jako const nebo readonly , pokud assembly_name je
SAFEneboEXTERNAL_ACCESS.
V rámci databáze může být registrován pouze jeden uživatelem definovaný typ pro libovolný zadaný typ, který byl odeslán na SQL Serveru z CLR. Pokud je uživatelem definovaný typ vytvořen v typu CLR, pro který již v databázi existuje uživatelem definovaný typ, CREATE TYPE selže s chybou. Toto omezení se vyžaduje, aby se zabránilo nejednoznačnosti při překladu typů SQL, pokud je možné typ CLR namapovat na více než jeden uživatelem definovaný typ.
Pokud jakákoli metoda mutatoru v typu nevrací void, CREATE TYPE příkaz se nespustí.
Chcete-li upravit typ definovaný uživatelem, musíte typ odstranit pomocí DROP TYPE příkazu a pak ho znovu vytvořit.
Na rozdíl od uživatelem definovaných typů, které jsou vytvořeny pomocí sp_addtype, role veřejné databáze není automaticky udělena REFERENCES oprávnění k typům vytvořeným pomocí CREATE TYPE. Toto oprávnění musí být uděleno samostatně.
V uživatelem definovaných typech tabulek jsou strukturované uživatelem definované typy, které se používají v column_name<datovém typu> , součástí oboru schématu databáze, ve kterém je definován typ tabulky. Pro přístup k strukturovaným uživatelsky definovaným typům v jiném oboru v databázi použijte názvy dvou částí.
V uživatelem definovaných typech tabulek musí být PERSISTED primární klíč pro počítané sloupce a NOT NULL.
V databázi SQL Fabric je možné vytvořit uživatelem definované typy, ale nejsou zrcadlené na Fabric OneLake a sloupce uživatelem definovaných typů se přeskočí v zrcadlení.
Typy tabulek optimalizovaných pro paměť
Počínaje SQL Serverem 2014 (12.x) je možné zpracovávat data v typu tabulky v primární paměti a ne na disku. Další informace najdete v tématu In-Memory přehled a scénáře použití OLTP. Ukázky kódu ukazující, jak vytvářet typy tabulek optimalizovaných pro paměť, najdete v tématu Vytvoření tabulky Memory-Optimized a nativně zkompilované uložené procedury.
Permissions
Vyžaduje CREATE TYPE oprávnění v aktuální databázi a ALTER oprávnění k schema_name. Pokud není zadaný schema_name , použijí se výchozí pravidla překladu názvů pro určení schématu pro aktuálního uživatele. Pokud je zadán assembly_name , musí uživatel buď vlastnit sestavení, nebo k němu mít REFERENCES oprávnění.
Pokud jsou v příkazu definovány nějaké sloupce CREATE TABLE typu definovaného uživatelem, REFERENCES je vyžadováno oprávnění k typu definovanému uživatelem.
Uživatel, který vytváří tabulku se sloupcem, který používá uživatelem definovaný typ, potřebuje REFERENCES oprávnění k uživatelsky definovanému typu. Pokud musí být tato tabulka vytvořena v tempdbaplikaci , REFERENCES musí být buď oprávnění udělena explicitně při každém vytvoření tabulky, nebo tento datový typ a REFERENCES oprávnění musí být přidány model do databáze. Například:
CREATE TYPE dbo.udt_money FROM varchar(11) NOT NULL;
GO
GRANT REFERENCES ON TYPE::dbo.udt_money TO public
Pokud to uděláte, bude tento datový typ a REFERENCES oprávnění k dispozici trvale tempdb . Jinak po restartování SQL Serveru zmizí uživatelem definovaný datový typ a oprávnění. Další informace naleznete v tématu CREATE TABLE.
Pokud nechcete, aby každá nová databáze dědila definici a oprávnění pro tento uživatelem definovaný datový typ z modelu, můžete vytvořit a přiřadit příslušná oprávnění pouze v tempdb databázi pomocí uložené procedury po spuštění. Například:
USE master
GO
CREATE PROCEDURE setup_udt_in_tempdb
AS
EXEC ( 'USE tempdb;
CREATE TYPE dbo.udt_money FROM varchar(11) NOT NULL;
GRANT REFERENCES ON TYPE::dbo.udt_money TO public;')
GO
EXEC sp_procoption 'setup_udt_in_tempdb' , 'startup' , 'on'
GO
Alternativně místo použití dočasných tabulek zvažte použití proměnných tabulek, pokud potřebujete odkazovat na uživatelsky definované datové typy pro potřeby dočasného úložiště. U proměnných tabulky, které odkazují na uživatelem definované datové typy, nemusíte explicitně udělovat oprávnění pro uživatelem definovaný datový typ.
Examples
A. Vytvoření typu aliasu na základě datového typu varchar
Následující příklad vytvoří typ aliasu na základě systémového varchar datového typu.
CREATE TYPE SSN
FROM VARCHAR(11) NOT NULL;
B. Vytvoření uživatelem definovaného typu
platí pro: SQL Server
Následující příklad vytvoří typ Utf8String , který odkazuje na třídu utf8string v sestavení utf8string. Před vytvořením typu je sestavení utf8string registrováno v místní databázi. Nahraďte binární část CREATE ASSEMBLY příkazu platným popisem.
CREATE ASSEMBLY utf8string
AUTHORIZATION [dbi]
FROM 0x4D... ;
GO
CREATE TYPE Utf8String
EXTERNAL NAME utf8string.[Microsoft.Samples.SqlServer.utf8string];
GO
C. Vytvoření uživatelem definovaného typu tabulky
Následující příklad vytvoří uživatelem definovaný typ tabulky, který má dva sloupce. Další informace o vytváření a používání parametrů hodnot tabulky naleznete v tématu Použití parametrů Table-Valued (databázový stroj).
CREATE TYPE LocationTableType AS TABLE (
LocationName VARCHAR(50),
CostRate INT
);
GO
D. Vytvoření uživatelem definovaného typu tabulky s primárním klíčem a indexem
Následující příklad vytvoří uživatelem definovaný typ tabulky, který má tři sloupce, z nichž jeden (Name) je primární klíč a jiný (Price) má neclusterovaný index. Další informace o vytváření a používání parametrů hodnot tabulky naleznete v tématu Použití parametrů Table-Valued (databázový stroj).
CREATE TYPE InventoryItem AS TABLE (
[Name] NVARCHAR(50) NOT NULL,
SupplierId BIGINT NOT NULL,
Price DECIMAL(18, 4) NULL,
PRIMARY KEY (Name),
INDEX IX_InventoryItem_Price(Price)
);
GO
Související obsah
- VYTVOŘIT SHROMÁŽDĚNÍ (Transact-SQL)
- typ drop (Transact-SQL)
- EVENTDATA (Transact-SQL)
- Typy User-Defined CLR
- Práce s typy User-Defined na SQL Serveru