如何列出 SQL Server 用户定义表类型的主键?

3
我的问题很简单,如何列出 SQL Server 用户定义表类型的主键(列名)?
例如:
CREATE TYPE [dbo].[MyTableType] AS TABLE
(
    [ID] int NOT NULL, PRIMARY KEY CLUSTERED ( [ID])
)

如何使用查询语句获取[ID]

似乎只能在实际表中找到主键,而不是表类型。


这个链接的问题根本没有涉及UDTs。很可能这是另一个问题的重复。 - Panagiotis Kanavos
@PanagiotisKanavos 我没有找到一个,这就是为什么我在问。 - Fredou
@PanagiotisKanavos 我这么说明是因为很多人会简单地标记它为重复。 - Fredou
不要发布与问题无关的链接。此外,INFORMATION_SCHEMA视图已被弃用。您是否检查了sys.tablessys.key_constraints视图?如果您可以从那里找到信息,那么这就是任何关于主键的问题的重复,并且答案包含sys.key_constraints - Panagiotis Kanavos
为什么不获取使用类型创建的表的 PK?类型不是表。它从技术上讲没有主键。它只有将创建一个主键的代码。 - Tab Alleman
显示剩余2条评论
2个回答

3

这个信息存储在目录视图中:

SELECT  c.Name
FROM    sys.table_types AS tt
        INNER JOIN sys.key_constraints AS kc
            ON kc.parent_object_id = tt.type_table_object_id
        INNER JOIN sys.indexes AS i
            ON i.object_id = kc.parent_object_id
            AND i.index_id = kc.unique_index_id
        INNER JOIN sys.index_columns AS ic
            ON ic.object_id = kc.parent_object_id
        INNER JOIN sys.columns AS c
            ON c.object_id = ic.object_id
            AND c.column_id = ic.column_id
WHERE   tt.Name = 'YourTypeName';

1
一个用户定义的表并不是真正的表,所以它在 sys.table_types 中有一个条目,而不是在 sys.tables 中。
如果使用 sys.table_types.type_table_object_idsys.key_constraints.parent_object_id 字段,可以像其他表一样从 sys.key_constraints 中检索关键信息。
create TYPE TestTableType AS TABLE 
( 
    ID int primary key,
    Name nVARCHAR(50)
)

declare @typeID int

select @typeId=type_table_object_id 
from sys.table_types
where name='TestTableType'

select @typeId
-- Returns 1134627085

select * 
from sys.key_constraints
where parent_object_id=@typeID

-- Returns 
-- PK__TT_TestT__3214EC27BA14A4A6   1150627142  NULL    4   1134627085  PK  PRIMARY_KEY_CONSTRAINT  2016-04-25 17:36:34.890 2016-04-25 17:36:34.890 1   0   0   1   1

此后,您可以通过与 sys.index_columnssys.columns 进行连接的方式,以与其他主键相同的方式获取列名:

select col.name
from sys.key_constraints kcon
    inner join sys.index_columns indcol on indcol.object_id=kcon.parent_object_id
    inner join sys.columns col on col.object_id = kcon.parent_object_id 
               and col.column_id = indcol.column_id
where parent_object_id=@typeID

或者

select col.name
from sys.table_types tt 
    inner join sys.key_constraints kcon on type_table_object_id=kcon.parent_object_id
    inner join sys.index_columns indcol on indcol.object_id=kcon.parent_object_id
    inner join sys.columns col on col.object_id = kcon.parent_object_id and col.column_id = indcol.column_id
where tt.name='TestTableType'

这仍然没有给我列名。 - Fredou
@Fredou 在我回答后才添加了这个要求。 - Panagiotis Kanavos
看编辑历史记录,原始问题的第一行有 (列名) 指定。 - Fredou

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