SQL Server使用架构无法正常工作创建用户定义的表类型

前端之家收集整理的这篇文章主要介绍了SQL Server使用架构无法正常工作创建用户定义的表类型前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用以下语句在sql Server 2008R2 / 2012上创建用户定义的表类型:
CREATE TYPE [MySchemaName].[MyUserTableType] 
   As Table ( [Id] varchar(20) NOT NULL );

这按预期工作.

我还有一个存储过程,它删除给定Schema的所有相关对象.
这是我的用户定义的表类型无法正常工作的地方.我在期待
那些类型是使用关联的模式创建的.

如果我尝试删除架构,它会抱怨架构与我的用户定义表类型相关联.因此它不会被删除.

但是,如果我查询我的数据库中TYPE_TABLE的所有对象,它告诉我我的表类型不属于我的模式.它们属于模式’sys’

SELECT name,schema_id,type_desc 
FROM [TESTDB].SYS.OBJECTS 
WHERE type_desc = 'TYPE_TABLE';

SELECT * FROM sys.schemas;

知道为什么吗?

这是我输出的截图

解决方法

您应该查看sys.types或sys.table_types(它还会公开type_table_object_id),而不是在sys.objects中查找这些内容.
SELECT name,schema_id /*Will be the "test" schema id*/
FROM   sys.types
WHERE  is_table_type = 1
       AND name = 'MyUserTableType'

创建用户定义类型时,它会向sys.sysscalartypes添加一行,其中包含用户提供的模式和名称,以及sys.sysschobjs中的一行,并在sys模式中使用系统生成名称.系统生成名称是通过连接对象ID的TT_ FriendlyName _ Hex版本创建的.

这两个实体通过sys.syssingleobjrefs相互关联

/*This query only works via the DAC*/
SELECT so.id AS object_id,st.id AS user_type_id,*
FROM   sys.sysschobjs so
       JOIN sys.syssingleobjrefs sor
         ON sor.indepid = so.id
       JOIN sys.sysscalartypes st
         ON st.id = sor.depid
WHERE  st.name = 'MyUserTableType'

猜你在找的MsSQL相关文章