Sql server 如何使用SQL查询在SQL Server 2008 R2中获取用户定义的类型定义?

Sql server 如何使用SQL查询在SQL Server 2008 R2中获取用户定义的类型定义?,sql-server,sql-server-2008-r2,user-defined-types,Sql Server,Sql Server 2008 R2,User Defined Types,我创建了一个示例java程序,在该程序中,我使用以下查询获取所有对象(如视图、触发器、函数等)的定义: select object_definition(object_id) from sys.objects where type = 'V'; //for Views select object_definition(object_id) from sys.objects where type = 'TF'; //for Functions select object_definit

我创建了一个示例java程序,在该程序中,我使用以下查询获取所有对象(如视图、触发器、函数等)的定义:

select object_definition(object_id) 
from sys.objects 
where type = 'V'; //for Views

select object_definition(object_id) 
from sys.objects 
where type = 'TF'; //for Functions

select object_definition(object_id) 
from sys.objects 
where type = 'TR'; //for triggers
但是
sys.objects
不包含用户定义的数据类型和用户定义的表类型。我使用以下查询获取用户定义的类型:-

select * 
from sys.types 
where is_user_defined = 1;

是否有任何sql查询可用于获取用户定义的数据类型和用户定义的表类型的定义?

用户定义的类型本身不会有对象定义-它是一种类型而不是对象

对于用户定义的表类型,您可以从
sys.table\u types
中获取信息,但与从
sys.objects
中的用户表的
object\u id
中获取信息相比,您无法从该表的
type\u object\u id
中获取
对象定义。您可能希望查看此链接以创建表创建脚本:

对于UDT,您必须遵循类似的路径,编写查询系统表以获取类型信息的内容,然后相应地构建SQL字符串。您需要像SQL一样运行(在编写类型创建脚本时基于服务器的跟踪):

exec sp_executesql N'SELECT
圣名为[名称],
sst.name作为[Schema],
作为[所有者],
转换为[IsSchemaOwned],
st.user_类型_id为[id],
强制转换(当baset.name为(N“nchar”,N“nvarchar”)且st.max_长度为-1,然后st.max_长度为/2,否则st.max_长度为int)为[length],
转换(标准精度为int)为[数值精度],
按[NumericScale]进行转换(标准刻度为int),
强制转换(当baset.name(N“decimal”、N“int”、N“numeric”、N“smallint”、N“tinyint”、N“bigint”)中的1或0以位结尾时的大小写为[AllowedTity],
标准最大长度为[MaxLength],
st.is_可空为[nullable],
(当st.default_object_id=0,则N''else def.name结束时的情况)为[default],
(如果st.default_object_id=0,则N''else schema_name(def.schema_id)结束)为[DefaultSchema],
(当st.rule\u object\u id=0,则N''else rul.name结束时的情况)作为[规则],
(当st.rule_object_id=0时,则N''else schema_name(rul.schema_id)结束)为[RuleSchema],
ISNULL(st.collation\u名称,N“”)为[collation],
将(N“varchar”、N“varbinary”、N“nvarchar”)中的baset.name转换为[VariableLength],然后将1或0作为位结束,
baset.name为[SystemType]
从…起
sys.types为st
将sys.schema作为sst.schema_id=st.schema_id上的sst进行内部连接
左外部连接sys.database_主体作为s1st在s1st.principal_id=ISNULL(st.principal_id,(TYPEPROPERTY(QUOTENAME(SCHEMA_NAME(st.SCHEMA_id))+'.''.+QUOTENAME(st.NAME),'OwnerId'))
左外部连接sys.types为baset ON(baset.user\u type\u id=st.system\u type\u id和baset.user\u type\u id=baset.system\u type\u id)或((baset.system\u type\u id=st.system\u type\u id)和(baset.user\u type\u id=st.user\u type\u id)和(baset.is\u user\u defined=0)和(baset.is\u assembly\u type=1))
左外连接sys.objects作为def.object\u id=st.default\u object\u id上的def
左外连接sys.objects作为rul ON rul.object\u id=st.rule\u object\u id上的rul
哪里
(st.schema_id!=4和st.system_type_id!=240和st.user_type_id!=st.system_type_id和st.is_table_type!=1)和(st.name=@_msparam_0和sst.name=@_msparam_1),N'@_msparam_0 nvarchar(4000),@_msparam_-1 nvarchar(4000),@_-msparam_-0=N't-your't't't,msu-param=N'

否我不是指绑定到类型的规则的定义。我指的是确切的类型定义,如“从datetime null创建类型birthday;”谢谢你的回复。这不是我需要的确切代码,但它帮助我为用户定义的类型创建了自己的脚本。它还不完美,但我正在努力完善它。
exec sp_executesql N'SELECT
st.name AS [Name],
sst.name AS [Schema],
ISNULL(s1st.name, N'''') AS [Owner],
CAST(case when st.principal_id is null then 1 else 0 end AS bit) AS     [IsSchemaOwned],
st.user_type_id AS [ID],
CAST(CASE WHEN baset.name IN (N''nchar'', N''nvarchar'') AND st.max_length <> -1 THEN st.max_length/2 ELSE st.max_length END AS int) AS [Length],
CAST(st.precision AS int) AS [NumericPrecision],
CAST(st.scale AS int) AS [NumericScale],
CAST(CASE WHEN baset.name IN (N''decimal'', N''int'', N''numeric'', N''smallint'', N''tinyint'', N''bigint'') THEN 1 ELSE 0 END AS bit) AS [AllowIdentity],
st.max_length AS [MaxLength],
st.is_nullable AS [Nullable],
(case when st.default_object_id = 0 then N'''' else def.name end) AS [Default],
(case when st.default_object_id = 0 then N'''' else schema_name(def.schema_id) end) AS [DefaultSchema],
(case when st.rule_object_id = 0 then N'''' else rul.name end) AS [Rule],
(case when st.rule_object_id = 0 then N'''' else schema_name(rul.schema_id) end) AS [RuleSchema],
ISNULL(st.collation_name, N'''') AS [Collation],
CAST(CASE WHEN baset.name IN ( N''varchar'', N''varbinary'', N''nvarchar'' )     THEN 1 ELSE 0 END AS bit) AS [VariableLength],
baset.name AS [SystemType]
FROM
sys.types AS st
INNER JOIN sys.schemas AS sst ON sst.schema_id = st.schema_id
LEFT OUTER JOIN sys.database_principals AS s1st ON s1st.principal_id =     ISNULL(st.principal_id, (TYPEPROPERTY(QUOTENAME(SCHEMA_NAME(st.schema_id)) + ''.'' + QUOTENAME(st.name), ''OwnerId'')))
LEFT OUTER JOIN sys.types AS baset ON (baset.user_type_id = st.system_type_id and baset.user_type_id = baset.system_type_id) or ((baset.system_type_id = st.system_type_id) and (baset.user_type_id = st.user_type_id) and (baset.is_user_defined = 0) and (baset.is_assembly_type = 1)) 
LEFT OUTER JOIN sys.objects AS def ON def.object_id = st.default_object_id
LEFT OUTER JOIN sys.objects AS rul ON rul.object_id = st.rule_object_id
WHERE
(st.schema_id!=4 and st.system_type_id!=240 and st.user_type_id != st.system_type_id and st.is_table_type != 1)and(st.name=@_msparam_0 and sst.name=@_msparam_1)',N'@_msparam_0 nvarchar(4000),@_msparam_1 nvarchar(4000)',@_msparam_0=N't_your_udt',@_msparam_1=N'your_schema_name'