共用方式為


CREATE TYPE (Transact-SQL)

在 SQL Server 或 Azure SQL Database 的目前資料庫中建立別名資料類型或使用者定義型別。 別名資料類型的實作是以 SQL Server 原生系統類型為基礎。 使用者自訂類型是利用 Microsoft .NET Framework Common Language Runtime (CLR) 中之組件的類別來實作的。 若要將使用者定義型別繫結到它的實作,必須先在 SQL Server 中利用 CREATE ASSEMBLY 來註冊內含該型別之實作的 CLR 組件。

在 SQL Server 中,依預設,執行 CLR 程式碼的功能是關閉。 您可以建立、修改及卸除參考 Managed 程式碼模組的資料庫物件,但除非您利用 sp_configure 來啟用 clr enabled 選項,否則,這些參考就不會在 SQL Server 中執行。

適用於:SQL Server (SQL Server 2008 透過目前版本)、Azure SQL Database (初始版本,透過目前版本)。

主題連結圖示 Transact-SQL 語法慣例

語法

Disk-Based Type Syntax
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> }
        [ <table_constraint> ] [ ,...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 }
}

Memory-Optimized Table Type Syntax
CREATE TYPE [schema_name. ] type_name
AS TABLE ( { <column_definition> }
    |  [ <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 WITH (BUCKET_COUNT = bucket_count) | NONCLUSTERED } }

< table_index > ::=
  INDEX constraint_name
{ { [ NONCLUSTERED ] HASH (column [ ,... n ] ) WITH (BUCKET_COUNT = bucket_count) |  [NONCLUSTERED]  (column [ ASC | DESC ] [ ,... n ] )} }

<table_option> ::=
{
    [MEMORY_OPTIMIZED = {ON | OFF}]
}

引數

  • schema_name
    這是別名資料類型或使用者自訂類型所屬的結構描述名稱。

  • type_name
    這是別名資料類型或使用者自訂類型的名稱。 類型名稱必須符合識別碼的規則。

  • base_type
    這是 SQL Server 提供的資料類型,別名資料類型以該資料類型為基礎。base_type 是 sysname,沒有預設值,它可以是下列值之一:

    bigint

    binary(n)

    bit

    char(n)

    date

    datetime

    datetime2

    datetimeoffset

    decimal

    float

    image

    int

    money

    nchar(n)

    ntext

    numeric

    nvarchar(n |max)

    real

    smalldatetime

    smallint

    smallmoney

    sql_variant

    text

    time

    tinyint

    uniqueidentifier

    varbinary(n |max)

    varchar(n |max)

    base_type 也可以是對應至這些系統資料類型之一的任何資料類型同義字。

  • precision
    如果是 decimal 或 numeric,這會是一個非負數整數,它指出可儲存的最大十進位數總數,小數點左右兩側都包括在內。 如需詳細資訊,請參閱<decimal 和 numeric (Transact-SQL)>。

  • scale
    如果是 decimal 或 numeric,這會是一個非負數整數,它指出小數點右側所能儲存的最大十進位數,且它必須小於或等於有效位數。 如需詳細資訊,請參閱<decimal 和 numeric (Transact-SQL)>。

  • NULL | NOT NULL
    指定類型可否保留 Null 值。 若未指定,NULL 是預設值。

  • assembly_name

    適用於:SQL Server 2008 至 SQL Server 2014。

    指定 SQL Server 組件,來參考 Common Language Runtime 中之使用者自訂類型的實作。assembly_name 應符合目前資料庫之 SQL Server 中的現有組件。

    注意

    自主資料庫無法使用 EXTERNAL_NAME。

  • [. class_name ]

    適用於:SQL Server 2008 至 SQL Server 2014。

    指定組件內實作使用者自訂類型的類別。 class_name 必須是有效的識別碼,而且必須以類別的型式存在於具有組件可見性的組件中。 不論資料庫定序為何,class_name 都要區分大小寫,且必須完全符合相對應組件中的類別名稱。 如果用來撰寫類別的程式設計語言使用命名空間概念 (如 C#),類別名稱可以是一個以方括號 ([ ]) 括住之符合命名空間資格的名稱。 如果未指定 class_name,則 SQL Server 會假設它與 type_name 相同。

  • <column_definition>
    定義使用者定義資料表類型的資料行。

  • <資料類型>
    針對使用者定義資料表類型定義資料行中的資料類型。 如需有關資料類型的詳細資訊,請參閱<資料類型 (Transact-SQL)>。 如需有關資料表的詳細資訊,請參閱<CREATE TABLE (SQL Server)>。

  • <column_constraint>
    定義使用者定義資料表類型的資料行條件約束。 支援的條件約束包括 PRIMARY KEY、UNIQUE 和 CHECK。 如需有關資料表的詳細資訊,請參閱<CREATE TABLE (SQL Server)>。

  • <computed_column_definition>
    將計算資料行運算式定義為使用者定義資料表類型中的資料行。 如需有關資料表的詳細資訊,請參閱<CREATE TABLE (SQL Server)>。

  • <table_constraint>
    定義使用者定義資料表類型上的資料表條件約束。 支援的條件約束包括 PRIMARY KEY、UNIQUE 和 CHECK。

  • <index_option>
    指定在唯一叢集或唯一非叢集索引的多資料列插入作業中,對於索引鍵值重複的錯誤回應。 如需有關索引選項的詳細資訊,請參閱<CREATE INDEX (Transact-SQL)>。

  • INDEX
    您必須指定資料行和資料表索引,做為 CREATE TABLE 陳述式的一部分。 記憶體最佳化的資料表不支援 CREATE INDEX 和 DROP INDEX。

  • MEMORY_OPTIMIZED

    適用於:SQL Server 2014 至 SQL Server 2014。

    指出資料表類型是否為記憶體最佳化。 此選項預設關閉;資料表 (類型) 不是記憶體最佳化的資料表 (類型)。 記憶體最佳化的資料表類型是記憶體最佳化的使用者資料表,其結構描述保存在磁碟上,類似於其他使用者資料表。 記憶體最佳化的資料表類型只能從原生編譯預存程序存取。

  • BUCKET_COUNT

    適用於:SQL Server 2014 至 SQL Server 2014。

    指出應該在雜湊索引中建立的貯體數目。 雜湊索引中 BUCKET_COUNT 的最大值是 1,073,741,824。 如需有關值區計數的詳細資訊,請參閱<判斷雜湊索引的正確值區計數>。 bucket_count 是必要的引數。

  • HASH

    適用於:SQL Server 2014 至 SQL Server 2014。

    表示已建立雜湊索引。 只有記憶體最佳化的資料表才支援雜湊索引。

備註

assembly_name 中參考的組件類別及其方法,應符合在 SQL Server 中實作使用者自訂類型的所有需求。 如需有關這些需求的詳細資訊,請參閱<CLR 使用者定義型別>。

其他考量包括以下各項:

  • 類別可以有多載的方法,但只能從 Managed 程式碼內 (不能從 Transact-SQL 內) 呼叫這些方法。

  • 如果 assembly_name 是 SAFE 或 EXTERNAL_ACCESS,任何靜態成員都必須宣告為 constreadonly

在資料庫內,只能有一個依照已從 CLR 上傳至 SQL Server 中之任何指定類型來註冊的使用者自訂類型。 如果使用者自訂類型建立在某 CLR 類型上,而針對該 CLR 類型,在資料庫中已存在使用者自訂類型,則 CREATE TYPE 會因錯誤而失敗。 如果 CLR 類型可以對應至多個使用者自訂類型,就需要利用這項限制來避免 SQL 類型解析期間的模稜兩可。

如果類型中有任何 mutator 方法沒有傳回空值,CREATE TYPE 陳述式就不執行。

若要修改使用者自訂類型,您必須利用 DROP TYPE 陳述式卸除該類型,然後重新建立它。

public 資料庫角色與使用 sp_addtype 建立的使用者定義型別不同,前者不會在使用 CREATE TYPE 建立的類型上自動被授與 REFERENCES 權限。 這個權限必須另外授與。

在使用者定義的資料表類型中,column_name <data type> 中使用的結構化使用者定義型別屬於資料表類型定義所在之資料庫結構描述範圍的一部分。 若要在資料庫中存取不同範圍內的結構化使用者定義型別,請使用兩部分的名稱。

在使用者定義的資料表類型中,計算資料行的主索引鍵必須是 PERSISTED 和 NOT NULL。

記憶體最佳化的資料表類型

從 SQL Server 2014 開始,資料表類型的資料處理可以在主要記憶體中執行,而不是在磁碟上。 如需詳細資訊,請參閱<In-Memory OLTP (記憶體中最佳化)>。 如需示範如何建立記憶體最佳化資料表類型的程式碼範例,請參閱<建立記憶體最佳化資料表和原生編譯的預存程序>。 如需有關記憶體最佳化資料表類型的詳細資訊,請參閱<記憶體最佳化資料表變數>。

權限

需要在目前資料庫中的 CREATE TYPE 權限,以及在 schema_name 上的 ALTER 權限。 如果未指定 schema_name,則套用用來判斷目前使用者之結構描述的預設名稱解析規則。 如果指定了 assembly_name,使用者必須擁有該組件,或必須有在該組件上的 REFERENCES 權限。

範例

A.根據 varchar 資料類型建立別名類型

下列範例根據系統提供的 varchar 資料類型建立別名資料類型。

CREATE TYPE SSN
FROM varchar(11) NOT NULL ;

B.建立使用者自訂類型

下列範例建立 Utf8String 類型,它參考 utf8string 組件中的 utf8string 類別。 建立該類型之前,必須先在本機資料庫中註冊 utf8string 組件。

適用於:SQL Server 2008 至 SQL Server 2014。

CREATE ASSEMBLY utf8string
FROM '\\ComputerName\utf8string\utf8string.dll' ;
GO
CREATE TYPE Utf8String 
EXTERNAL NAME utf8string.[Microsoft.Samples.SqlServer.utf8string] ;
GO

C.建立使用者自訂資料表類型

下列範例會建立有兩個資料行的使用者定義資料表類型。 如需有關如何建立及使用資料表值參數的詳細資訊,請參閱<使用資料表值參數 (Database Engine)>。

/* Create a user-defined table type */
CREATE TYPE LocationTableType AS TABLE 
    ( LocationName VARCHAR(50)
    , CostRate INT );
GO

請參閱

參考

CREATE ASSEMBLY (Transact-SQL)

DROP TYPE (Transact-SQL)

EVENTDATA (Transact-SQL)