【问题标题】:SQL Server create User-Defined Table Types with schema not working properlySQL Server 创建用户定义的表类型,其架构无法正常工作
【发布时间】:2013-11-07 05:28:42
【问题描述】:

我正在使用以下语句在 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;

知道为什么吗?

这是我输出的截图

【问题讨论】:

  • 据我了解,用户定义类型始终分配给“SYS”模式,因此这是预期的行为。用户定义的模式可以分配给函数、过程、表和触发器

标签: sql sql-server schema user-defined-types


【解决方案1】:

您应该查看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 架构中使用系统生成的名称。系统生成的名称由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' 

【讨论】:

    猜你喜欢
    • 2014-04-18
    • 2017-08-19
    • 1970-01-01
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    相关资源
    最近更新 更多