gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 02:44:16 24 4
gpt4 key购买 nike

我使用以下语句在 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.objects对于这些,您应该查看 sys.typessys.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_ 创建的。 + 友好名称 + _ + 对象 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'

关于SQL Server 创建用户定义的表类型时架构无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19634846/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com