SQL Server创建具有模式的用户定义表类型不正常工作

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

CREATE TYPE [MySchemaName].[MyUserTableType] 
   As Table ( [Id] varchar(20) NOT NULL );

这个操作起到了预期的作用。我还有一个存储过程,可以删除给定架构下的所有相关对象。这就是我的用户定义表类型无法正常工作的地方。我希望这些类型是在创建时与一个关联的模式一起创建的。如果尝试删除该架构,则会提示该架构与我的用户定义表类型相关联。因此,它将不会被删除。但是,如果查询我的数据库中所有的TYPE_TABLE对象,它会告诉我,我的表类型不属于我的模式。它们属于“sys”模式。
SELECT name, schema_id, type_desc 
FROM [TESTDB].SYS.OBJECTS 
WHERE type_desc = 'TYPE_TABLE';

SELECT * FROM sys.schemas;

有什么想法吗?
这是我输出的截图: enter image description here

据我所知,用户定义类型始终分配给“SYS”模式,因此这是预期的行为。用户定义模式可以分配给函数、过程、表和触发器。 - talegna
1个回答

6

不要在sys.objects中查找这些内容,而应该在sys.types或者sys.table_types中查找(后者还公开了type_table_object_id)。

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 架构中生成系统名称。系统生成的名称是通过连接 TT_ + FriendlyName + _ + 对象 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' 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接