有不同种类的用户定义类型:用户定义表类型(UDTT)、用户定义类型(UDT;通过 SQLCLR 实现的复杂类型)和用户定义数据类型(UDDT;主要是现有系统类型的同义词,但尺寸/精度和NULL
/NOT NULL
包括)。
您无需担心 UDTT,因为它们不能是表中的列。
您可能无法处理 UDT,至少现在不能,因为这会增加很多复杂性,因为您还需要复制程序集。
有一个主要的系统目录视图:sys.types
。以下内容应该可以满足您的大部分需求,如果不是全部的话。collation_name
似乎无法使用,无论是通过测试一个简单CREATE TYPE
的测试,还是文档。
SELECT N'CREATE TYPE ' + QUOTENAME(sch.[name])
+ N'.' + QUOTENAME(typ.[name])
+ N' FROM ' + styp.[name]
+ CASE
WHEN typ.[system_type_id] IN
(41, 42, 43, 106, 108, 165, 167, 173, 175, 231, 239)
THEN N'('
+ CASE
WHEN typ.[max_length] = -1 -- for: VARCHAR, NVARCHAR, VARBINARY
THEN N'MAX'
WHEN typ.[system_type_id] IN (165, 167, 173, 175)
-- VARBINARY, VARCHAR, BINARY, CHAR
THEN CONVERT(NVARCHAR(5), typ.[max_length])
WHEN typ.[system_type_id] IN (231, 239) -- NVARCHAR, NCHAR
THEN CONVERT(NVARCHAR(5), (typ.[max_length] / 2))
WHEN typ.[system_type_id] IN (41, 42, 43)
-- TIME, DATETIME2, DATETIMEOFFSET
THEN CONVERT(NVARCHAR(5), typ.[scale])
WHEN typ.[system_type_id] IN (106, 108) -- DECIMAL, NUMERIC
THEN CONVERT(NVARCHAR(5), typ.[precision])
+ N', ' + CONVERT(NVARCHAR(5), typ.[scale])
END
+ N')'
ELSE N''
END
+ CASE typ.[is_nullable] WHEN 1 THEN N' NULL' ELSE ' NOT NULL' END
+ N';'
FROM sys.types typ
INNER JOIN sys.schemas sch
ON sch.[schema_id] = typ.[schema_id]
INNER JOIN sys.types styp
ON styp.[user_type_id] = typ.[system_type_id]
WHERE typ.[is_user_defined] = 1
AND typ.[is_assembly_type] = 0
AND typ.[is_table_type] = 0;
规则
!!这些已被弃用很长时间,不应使用!
文档_CREATE RULE
规则可以在:(sys.sql_modules
其中包括该字段CREATE
中的语句)[definition]
您将需要单独循环sys.types
,对于任何用户创建的类型 where rule_object_id <> 0
,执行EXEC sp_bindrule N'@rulename', N'@objectname';
。
默认值
!!这些已被弃用很长时间,不应使用!
文档_CREATE DEFAULT
默认值可以在以下位置找到:(sys.sql_modules
包括字段CREATE
中的声明[definition]
)
您将需要单独循环sys.types
,对于任何用户创建的类型 where default_object_id <> 0
,执行EXEC sp_bindefault N'@defaultname', N'@objectname';
。