在当前数据库中创建别名数据类型或用户定义类型。别名数据类型的实现基于 SQL Server 本机系统类型。用户定义类型通过 Microsoft .NET Framework 公共语言运行时 (CLR) 中的程序集的类来实现。若要将用户定义类型绑定到其实现,必须首先使用**CREATE ASSEMBLY **在 SQL Server 中注册包含该类型实现的 CLR 程序集。
语法
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 ] ]
<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 }
}
- type_name:别名数据类型或用户定义类型的名称。
- base_type:别名数据类型所基于的数据类型,由 SQL Server 提供,无默认值。
- precision:对于 decimal 或 numeric,其值为非负整数,指示可保留的十进制数字位数的最大值,包括小数点左边和右边的数字。
- scale:对于 decimal 或 numeric,其值为非负整数,指示十进制数字的小数点右边最多可保留多少位,它必须小于或等于精度值。
- NULL | NOT NULL:指定此类型是否可容纳空值。如果未指定,则默认值为 NULL。
- assembly_name:指定可在公共语言运行库中引用用户定义类型的实现的 SQL Server 程序集。
- [.class_name ]:指定实现用户定义类型的程序集内的类。class_name 必须是有效的标识符,而且必须在具有程序集可见性的程序集中作为类存在。class_name 区分大小写。
- <column_definition>:定义用户定义表类型的列。
- <data type>:定义用户定义表类型的列中的数据类型。
- <column_constraint>:定义用户定义表类型的列约束。支持的约束包括 PRIMARY KEY、UNIQUE 和 CHECK。
- <computed_column_definition>:将计算列表达式定义为用户定义表类型中的列。
- 用作 CHECK、FOREIGN KEY 或 NOT NULL 约束的计算列必须标记为 PERSISTED。如果计算列的值由具有确定性的表达式定义,并且索引列中允许使用计算结果的数据类型,则可将该列用作索引中的键列,或者用作 PRIMARY KEY 或 UNIQUE 约束的一部分。
例如,如果表中含有整数列 a 和 b,则可以对计算列 a + b 创建索引,但不能对计算列 a + DATEPART(dd, GETDATE()) 创建索引,因为在后续调用中,其值可能发生改变。 - 在用户定义表类型中,计算列的主键必须是 PERSISTED 和 NOT NULL。
- 计算列不能作为 INSERT 或 UPDATE 语句的目标。
- <table_constraint>:定义用户定义表类型的表约束。支持的约束包括 PRIMARY KEY、UNIQUE 和 CHECK。
- <index_option>:指定对唯一聚集索引或唯一非聚集索引执行多行插入操作时出现重复键值的错误响应。
示例
A. 基于 varchar 数据类型创建别名类型
CREATE TYPE SSN
FROM varchar(11) NOT NULL ;
B、创建用户定义表类型
CREATE TYPE LocationTableType AS TABLE
( LocationName VARCHAR(50),
CostRate INT
)
GO
C、 创建用户定义类型
以下示例创建类型Utf8String,该类型在程序集utf8string中引用类 utf8string 。创建类型之前,应在本地数据库中注册程序集 utf8string。
CREATE ASSEMBLY utf8string
FROM '\\ComputerName\utf8string\utf8string.dll' ;
GO
CREATE TYPE Utf8String
EXTERNAL NAME utf8string.[Microsoft.Samples.SqlServer.utf8string] ;
GO