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

SQL Server创建架构工作不正常的用户定义表类型,sql,sql-server,schema,user-defined-types,Sql,Sql Server,Schema,User Defined Types,我使用以下语句在SQL Server 2008R2/2012上创建用户定义的表类型: CREATE TYPE [MySchemaName].[MyUserTableType] As Table ( [Id] varchar(20) NOT NULL ); 这正是我们想要的 我还得到了一个存储过程,它删除了给定模式中所有关联的对象。 这就是我的用户定义表类型无法正常工作的地方。我期待着 这些类型是使用关联的架构创建的 如果我试图删除该模式,它会抱怨该模式与我的用户定义表类型相关联。因此,

我使用以下语句在SQL Server 2008R2/2012上创建用户定义的表类型:

CREATE TYPE [MySchemaName].[MyUserTableType] 
   As Table ( [Id] varchar(20) NOT NULL );
这正是我们想要的

我还得到了一个存储过程,它删除了给定模式中所有关联的对象。 这就是我的用户定义表类型无法正常工作的地方。我期待着 这些类型是使用关联的架构创建的

如果我试图删除该模式,它会抱怨该模式与我的用户定义表类型相关联。因此,它不会被删除

但如果我查询数据库中所有类型为_TABLE的对象,它会告诉我,我的表类型不属于我的模式。它们属于架构“sys”

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

SELECT * FROM sys.schemas;
知道为什么吗

这是我的输出截图

不要在
sys.objects
中查找这些对象,而应该在
sys.types
sys.table\u types
中查找这些对象(这还公开了
type\u table\u object\u id

创建用户定义的类型时,它会在
sys.sysscalartypes
中使用用户提供的架构和名称添加一行,在
sys
架构中使用系统生成的名称添加一行到
sys.sysschobjs
。系统生成的名称是通过连接对象id的十六进制版本创建的

这两个实体通过
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' 

我的理解是,用户定义的类型总是分配给“SYS”模式,因此这是预期的行为。用户定义的模式可以分配给函数、过程、表和触发器
/*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'