共用方式為


CREATE TYPE (Transact-SQL)

更新: 2006 年 4 月 14 日

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

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

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

語法

CREATE TYPE [ schema_name. ] type_name
{ 
    FROM base_type 
    [ ( precision [ , scale ] )  ]
    [ NULL | NOT NULL ] 
  | EXTERNAL NAME assembly_name [ .class_name ] 
} [ ; ]

引數

  • schema_name
    這是別名資料類型或使用者自訂類型所屬的結構描述名稱。
  • type_name
    這是別名資料類型或使用者自訂類型的名稱。類型名稱必須符合識別碼的規則。
  • base_type
    這是 SQL Server 提供的資料類型,別名資料類型以該資料類型為基礎。base_typesysname,沒有預設值,它可以是下列值之一:

    bigint

    binary(n)

    bit

    char(n)

    datetime

    decimal

    float

    image

    int

    money

    nchar(n)

    ntext

    numeric

    nvarchar(n | max)

    real

    smalldatetime

    smallint

    smallmoney

    sql_variant

    text

    tinyint

    uniqueidentifier

    varbinary(n | max)

    varchar(n | max)

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

  • precision
    如果是 decimalnumeric,這是一個非負數整數,它指出可儲存的最大十進位數總數,小數點左右兩側都包括在內。如需詳細資訊,請參閱<decimal 和 numeric (Transact-SQL)>。
  • scale
    如果是 decimalnumeric,這是一個非負數整數,它指出小數點右側所能儲存的最大十進位數,且它必須小於或等於有效位數。如需詳細資訊,請參閱<decimal 和 numeric (Transact-SQL)>。
  • NULL | NOT NULL
    指定類型可否保留 Null 值。若未指定,NULL 是預設值。
  • assembly_name
    指定 SQL Server 組件,來參考 Common Language Runtime 中之使用者自訂類型的實作。assembly_name 應符合目前資料庫之 SQL Server 中的現有組件。
  • **[.**class_name ]
    指定組件內實作使用者自訂類型的類別。class_name 必須是有效的識別碼,且必須以組件中的類別存在,而組件必須具有組件可見性。不論資料庫定序為何,class_name 都有區分大小寫,且必須完全符合相對應組件中的類別名稱。如果用來撰寫類別的程式設計語言使用命名空間概念 (如 C#),類別名稱可以是一個以方括號 ([]) 括住之符合命名空間資格的名稱。如果未指定 class_name,則 SQL Server 會假設它與 type_name 相同。

備註

使用 CREATE TYPE 來建立 CLR 使用者自訂類型時,資料庫相容性必須是 90。

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

其他考量包括以下各項:

  • 類別可以有多載的方法,但只能從 Managed 程式碼內 (不能從 Transact-SQL 內) 呼叫這些方法。
  • 如果 assembly_name 是 SAFE 或 EXTERNAL_ACCESS,任何靜態成員都必須宣告為 constreadonly

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

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

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

跟利用 sp_addtype 建立的使用者自訂類型不一樣,public 資料庫角色不會在利用 CREATE TYPE 建立的類型上自動被授與 REFERENCES 權限。這個權限必須另外授與。

權限

需要在目前資料庫中的 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 組件。

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

請參閱

參考

CREATE ASSEMBLY (Transact-SQL)
DROP TYPE (Transact-SQL)
EVENTDATA (Transact-SQL)

其他資源

使用別名資料類型
使用 CLR 使用者自訂類型

說明及資訊

取得 SQL Server 2005 協助

變更歷程記錄

版本 歷程記錄

2006 年 4 月 14 日

新增內容:
  • 在<備註>一節中,加入了使用 CREATE TYPE 來建立 CLR 使用者自訂類型時,資料庫相容性必須是 90 的句子。
  • [.class_name ] 的<引數>一節中,加入了如果未指定 class_name,則 SQL Server 會假設它與 type_name 相同。