我在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;
知道为什么吗?
以下是我输出的截图
答案 0 :(得分:5)
您应该查看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 + _
+ Hex版本的对象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'