Megosztás a következőn keresztül:


CREATE TYPE (Transact-SQL)

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példánySQL-adatbázis a Microsoft Fabricben

Alias adattípust vagy felhasználó által definiált típust hoz létre az SQL Server vagy az Azure SQL Database aktuális adatbázisában. Az alias adattípus implementálása egy adatbázismotor natív rendszertípusán alapul. A felhasználó által definiált típus a Microsoft .NET-keretrendszer közös nyelvi futtatókörnyezetében (CLR) egy szerelvény egy osztályán keresztül implementálható. A felhasználó által definiált típus implementációhoz való kötéséhez a típus implementálását tartalmazó CLR-szerelvényt először regisztrálni kell az adatbázismotorban a CREATE ASSEMBLY használatával.

A CLR-kód futtatásának lehetősége alapértelmezés szerint ki van kapcsolva az SQL Serverben. Létrehozhat, módosíthat és elvethet felügyelt kódmodulokra hivatkozó adatbázis-objektumokat. Ezek a hivatkozások azonban csak akkor hajthatók végre az SQL Serveren, ha a clr-kompatibilis beállítás engedélyezve van sp_configure használatával.

Note

NET-keretrendszer CLR SQL Server integrációját ebben a cikkben tárgyaljuk. A CLR integráció nem vonatkozik Azure SQL Database-re vagy SQL adatbázisra a Microsoft Fabric-ben, ahol a CLR (.NET) típusok nem támogatottak.

Transact-SQL szintaxis konvenciók

Syntax

Felhasználó által definiált adattípus szintaxisa:

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)]

Felhasználó által definiált memóriaoptimalizált táblázattípusok szintaxisa:

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

Annak a sémának a neve, amelyhez az alias adattípusa vagy a felhasználó által megadott típus tartozik.

type_name

Az alias adattípusának vagy felhasználó által definiált típusának neve. A típusneveknek meg kell felelniük az azonosítókra vonatkozó szabályoknak.

base_type

Az adatbázismotor olyan adattípust adott meg, amelyen az alias adattípus alapul. base_typea sysname érték, alapértelmezés nélkül, és az alábbi értékek egyike lehet:

  • bigint, int, smallint és tinyint
  • binary(n),varbinary(n) és varbinary(max)
  • bit
  • char(n), nchar(n), nvarchar(n), nvarchar(max), varchar(n), és varchar(max)
  • date, datetime, datetime2, datetimeoffset, smalldatetime és time
  • decimális és numerikus
  • lebegőpontos és valós
  • image
  • pénz és aprópénz
  • sql_variant
  • szöveg és ntext
  • uniqueidentifier

base_type bármilyen adattípus szinonimája is lehet, amely megfelelteti ezeket a rendszeradattípusokat.

precision

Decimális vagy numerikus szám esetén a pontosság nem negatív egész szám, amely a tárolható tizedesjegyek maximális számát jelzi a tizedesvessző bal és jobb oldalán egyaránt. További információ: decimális és numerikus (Transact-SQL).

scale

Decimális vagy numerikus érték esetén a skálázás nem negatív egész szám, amely a tizedesvessző jobb oldalán tárolható tizedesjegyek maximális számát jelzi, és a pontosságnál kisebbnek vagy egyenlőnek kell lennie. További információ: decimális és numerikus (Transact-SQL).

NULL | NEM NULL

Megadja, hogy a típus tartalmazhat-e null értéket. Ha nincs megadva, NULL akkor az alapértelmezett érték.

assembly_name

A következőkre vonatkozik: SQL Server

Megadja azt az SQL Server-szerelvényt, amely a felhasználó által definiált típus implementációjára hivatkozik a közös nyelvi futtatókörnyezetben. assembly_name egyeznie kell egy meglévő szerelvénysel az SQL Serverben az aktuális adatbázisban.

Note

EXTERNAL_NAME nem érhető el egy tartalmazott adatbázisban.

[ . class_name ]

A következőkre vonatkozik: SQL Server

Megadja a felhasználó által definiált típust megvalósító szerelvényen belüli osztályt. class_name érvényes azonosítónak kell lennie, és osztályként kell léteznie a szerelvényben a szerelvény láthatóságával. class_name az adatbázis-rendezéstől függetlenül megkülönbözteti a kis- és nagybetűktől, és pontosan meg kell egyeznie a megfelelő szerelvény osztálynevével. Az osztálynév lehet névtér-minősített név szögletes zárójelben ([ ]), ha az osztály írásához használt programozási nyelv a névterek fogalmát használja, például a C#-t. Ha class_name nincs megadva, az SQL Server feltételezi, hogy ugyanaz, mint type_name.

<column_definition>

A felhasználó által definiált táblatípus oszlopait határozza meg.

<adattípus>

Egy felhasználó által definiált táblatípus oszlopában definiálja az adattípust. Az adattípusokról további információt az Adattípusok (Transact-SQL) című témakörben talál. A táblákról további információt a CREATE TABLE (Transact-SQL) című témakörben talál.

<column_constraint>

A felhasználó által definiált táblatípus oszlopkorlátait határozza meg. A támogatott korlátozások közé tartoznak a PRIMARY KEYkövetkezők: , UNIQUEés CHECK. A táblákról további információt a CREATE TABLE (Transact-SQL) című témakörben talál.

<computed_column_definition>

Egy számított oszlopkifejezést definiál egy felhasználó által definiált táblatípus oszlopaként. A táblákról további információt a CREATE TABLE (Transact-SQL) című témakörben talál.

<table_constraint>

Egy felhasználó által definiált táblatípusra vonatkozó táblakorlátozást határoz meg. A támogatott korlátozások közé tartoznak a PRIMARY KEYkövetkezők: , UNIQUEés CHECK.

<index_option>

Megadja az ismétlődő kulcsértékekre adott hibaválaszt egy többsoros beszúrási műveletben egy egyedi fürtözött vagy egyedi nemclustered indexen. További információ az indexelési lehetőségekről: INDEX LÉTREHOZÁSA (Transact-SQL).

INDEX index_name [ FÜRTÖZÖTT | NEMCLUSTERED ] ( column_name [ ASC | DESC ] [ , ... n ] )

A következővonatkozik: SQL Server 2014 (12.x) és újabb verziók, Azure SQL Database és Felügyelt Azure SQL-példány.

Itt adhatja meg, hogy létre kell-e hozni egy indexet a táblában. Ez lehet fürtözött index vagy nemclustered index. Az index tartalmazza a felsorolt oszlopokat, és növekvő vagy csökkenő sorrendbe rendezi az adatokat.

INDEX

Az utasítás részeként oszlop- és táblaindexeket kell megadnia CREATE TABLE . CREATE INDEX és DROP INDEX nem támogatottak a memóriaoptimalizált táblák esetében.

MEMORY_OPTIMIZED

A következővonatkozik: SQL Server 2014 (12.x) és újabb verziók, Azure SQL Database és Felügyelt Azure SQL-példány. A felügyelt Azure SQL-példány nem támogatja a memóriaoptimalizált táblákat az általános célú szinten.

Azt jelzi, hogy a táblatípus memóriaoptimalizált-e. Ez a beállítás alapértelmezés szerint ki van kapcsolva; a tábla (típus) nem memóriaoptimalizált tábla (típus). A memóriaoptimalizált táblázattípusok memóriaoptimalizált felhasználói táblák, amelyek sémája a többi felhasználói táblához hasonlóan megmarad a lemezen.

BUCKET_COUNT

A következőkre vonatkozik: SQL Server 2014 (12.x) és újabb verziók, Azure SQL Database, Azure SQL Database és Felügyelt Azure SQL-példány.

A kivonatindexben létrehozandó gyűjtők számát jelzi. A kivonatindexek maximális értéke BUCKET_COUNT 1 073 741 824. A gyűjtők számáról további információt Memory-Optimized táblák indexei című témakörben talál. bucket_count kötelező argumentum.

HASH

A következőkre vonatkozik: SQL Server 2014 (12.x) és újabb verziók, Azure SQL Database, Azure SQL Database és Felügyelt Azure SQL-példány.

Azt jelzi, hogy létrejön egy HASH index. A kivonatindexek csak a memóriaoptimalizált táblákban támogatottak.

Remarks

A assembly_name hivatkozott szerelvény osztályának a metódusaival együtt meg kell felelnie az SQL Server felhasználó által definiált típusának implementálására vonatkozó összes követelménynek. További információ ezekről a követelményekről: CLR User-Defined típusok.

További szempontok a következők:

  • Az osztály tartalmazhat túlterhelt metódusokat, de ezek a metódusok csak felügyelt kódból hívhatók meg, a Transact-SQL-ből nem.

  • A statikus tagokat konstansként vagy írásvédettként kell deklarálni , ha assembly_name vagy SAFEEXTERNAL_ACCESS.

Az adatbázisban csak egy felhasználó által definiált típus regisztrálható a CLR-ből az SQL Serverbe feltöltött megadott típushoz. Ha egy felhasználó által definiált típus olyan CLR-típuson jön létre, amelyhez már létezik felhasználó által definiált típus az adatbázisban, CREATE TYPE hibaüzenet jelenik meg. Ez a korlátozás az SQL-típus feloldása során felmerülő kétértelműség elkerülése érdekében szükséges, ha egy CLR-típus több felhasználó által meghatározott típusra is megfeleltethető.

Ha a típus bármely mutációs metódusa nem ad vissza ürességet, az CREATE TYPE utasítás nem lesz végrehajtva.

Felhasználó által definiált típus módosításához el kell dobnia a típust egy DROP TYPE utasítással, majd újra létre kell hoznia.

A felhasználó sp_addtypeáltal létrehozott típusoktól eltérően a nyilvános adatbázis-szerepkör nem kap REFERENCES automatikusan engedélyt a használatával CREATE TYPElétrehozott típusokra. Ezt az engedélyt külön kell megadni.

A felhasználó által definiált táblatípusokban a column_name<adattípusban> használt strukturált felhasználó által definiált típusok annak az adatbázisséma-hatókörnek a részei, amelyben a táblatípus definiálva van. Ha az adatbázison belül egy másik hatókörben szeretné elérni a strukturált, felhasználó által definiált típusokat, használjon kétrészes neveket.

A felhasználó által definiált táblázattípusokban a számított oszlopok PERSISTED elsődleges kulcsának és NOT NULLa .

A Fabric SQL-adatbázisban a felhasználó által definiált típusok létrehozhatóak, de nem tükrözhetők a Fabric OneLake-hez, és a felhasználó által definiált típusok oszlopai ki lesznek hagyva a tükrözésben.

Memóriaoptimalizált táblázattípusok

Az SQL Server 2014 -től (12.x) kezdődően a táblatípusú adatok feldolgozása az elsődleges memóriában végezhető el, a lemezen nem. További információ: In-Memory OLTP áttekintése és használati forgatókönyvei. A memóriaoptimalizált táblázattípusok létrehozását bemutató kódmintákért lásd : Memory-Optimized tábla létrehozása és natívan lefordított tárolt eljárás.

Permissions

Az aktuális adatbázisban CREATE TYPE és a ALTER engedélyére van szükség. Ha schema_name nincs megadva, az aktuális felhasználó sémájának meghatározására vonatkozó alapértelmezett névfeloldási szabályok érvényesek. Ha assembly_name van megadva, a felhasználónak rendelkeznie kell a szerelvény tulajdonosával, vagy engedéllyel kell rendelkeznie REFERENCES .

Ha a CREATE TABLE utasítás bármely oszlopa felhasználó által definiált típusként van definiálva, REFERENCES felhasználó által definiált típusra vonatkozó engedély szükséges.

A felhasználó által definiált típust használó oszlopot tartalmazó táblát létrehozó felhasználónak szüksége van a REFERENCES felhasználó által megadott típusra vonatkozó engedélyre. Ha ezt a táblát tempdblétre kell hozni, akkor vagy az REFERENCES engedélyt explicit módon kell megadni a tábla létrehozása előtt , vagy ezt az adattípust és REFERENCES engedélyt hozzá kell adni az model adatbázishoz. Például:

CREATE TYPE dbo.udt_money FROM varchar(11) NOT NULL;
GO
GRANT REFERENCES ON TYPE::dbo.udt_money TO public

Ha ez megtörtént, akkor ez az adattípus és REFERENCES -engedély véglegesen elérhető tempdb lesz. Ellenkező esetben a felhasználó által megadott adattípus és -engedélyek eltűnnek az SQL Server újraindításakor. További információ: CREATE TABLE.

Ha nem szeretné, hogy minden új adatbázis a modelltől örökölje a felhasználó által definiált adattípus definícióját és engedélyeit, egy indítási tárolt eljárással csak tempdb az adatbázisban hozhatja létre és rendelheti hozzá a megfelelő engedélyeket. Például:

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

Azt is megteheti, hogy ideiglenes táblák használata helyett táblaváltozókat használ, ha felhasználó által definiált adattípusokra kell hivatkoznia az ideiglenes tárolási igényekhez. Ahhoz, hogy a táblaváltozók felhasználó által definiált adattípusokra hivatkozjanak, nem kell explicit módon engedélyeket adnia a felhasználó által definiált adattípushoz.

Examples

A. Aliastípus létrehozása a varchar-adattípus alapján

Az alábbi példa egy aliastípust hoz létre a rendszer által megadott varchar adattípus alapján.

CREATE TYPE SSN
FROM VARCHAR(11) NOT NULL;

B. Felhasználó által definiált típus létrehozása

A következőkre vonatkozik: SQL Server

Az alábbi példa létrehoz egy típust Utf8String , amely az osztályra utf8string hivatkozik a szerelvényben utf8string. A típus létrehozása előtt a rendszer regisztrálja a szerelvényt utf8string a helyi adatbázisban. Cserélje le az utasítás bináris részét CREATE ASSEMBLY érvényes leírásra.

CREATE ASSEMBLY utf8string
AUTHORIZATION [dbi]
FROM 0x4D... ;
GO

CREATE TYPE Utf8String
EXTERNAL NAME utf8string.[Microsoft.Samples.SqlServer.utf8string];
GO

C. Felhasználó által definiált táblatípus létrehozása

Az alábbi példa egy felhasználó által definiált táblázattípust hoz létre, amelynek két oszlopa van. A táblaértékű paraméterek létrehozásáról és használatáról további információt a Table-Valued paraméterek használata (adatbázismotor) című témakörben talál.

CREATE TYPE LocationTableType AS TABLE (
    LocationName VARCHAR(50),
    CostRate INT
);
GO

D. Felhasználó által definiált táblatípus létrehozása elsődleges kulccsal és indexel

Az alábbi példa egy felhasználó által definiált táblázattípust hoz létre, amely három oszlopból áll, amelyek közül az egyik (Name) az elsődleges kulcs, a másik (Price) pedig egy nemclustered indexet tartalmaz. A táblaértékű paraméterek létrehozásáról és használatáról további információt a Table-Valued paraméterek használata (adatbázismotor) című témakörben talál.

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