Sdílet prostřednictvím


TYP VYTVOŘIT (Transact-SQL)

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL 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).

Transact-SQL konvence syntaxe

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 SAFE nebo EXTERNAL_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