CREATE TYPE (Transact-SQL)

更新日期: 2006 年 4 月 14 日

在 SQL Server 2005 的实例中创建别名数据类型或用户定义类型。别名数据类型的实现基于 SQL Server 本机系统类型。用户定义类型通过 Microsoft .NET Framework 公共语言运行时 (CLR) 中的程序集的类来实现。对于要将用户定义类型绑定到其实现的 SQL Server 2005,必须首先使用 CREATE ASSEMBLY 在 SQL Server 中注册包含实现类型的 CLR 程序集。

ms175007.note(zh-cn,SQL.90).gif注意:
默认情况下,在 SQL Server 中运行 CLR 代码的功能处于关闭状态。您可以创建、修改和删除引用托管代码模块的数据库对象,但除非使用 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_type 的数据类型为 sysname,无默认值,可以是下列值之一:

    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。
  • assembly_name
    指定可在公共语言运行库中引用用户定义类型的实现的 SQL Server 程序集。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

其他注意事项包括以下几点:

  • 类可以具有重载方法,但只能从托管代码内而不能从 Transact-SQL 调用这些方法。
  • 如果 assembly_name 是 SAFE 或 EXTERNAL_ACCESS,则必须将所有静态成员声明为 constreadonly

在数据库内,任何从 CLR 上载到 SQL Server 中的指定类型都只能注册一个用户定义类型。如果数据库中已存在 CLR 类型的用户定义类型,则在对 CLR 类型创建用户定义类型时,CREATE TYPE 会因错误而失败。如果一个 CLR 类型可被映射到多个用户定义类型,则要求使用此限制来避免 SQL 类型解析过程中的混乱情况。

如果类型中的任何赋值函数方法未返回 void,则不会执行 CREATE TYPE 语句。

若要修改用户定义类型,必须使用 DROP TYPE 语句除去该类型,然后重新创建它。

与使用 sp_addtype 创建的用户定义类型不同,对于使用 CREATE TYPE 创建的类型,不会向 public 数据库角色自动授予该类型的 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 相同。