【问题标题】:How do you list the primary key of a SQL Server User Defined Table Type?如何列出 SQL Server 用户定义表类型的主键?
【发布时间】:2016-04-25 14:18:05
【问题描述】:

我的问题很简单,如何列出SQL Server用户定义的表类型的主键(列名)?

前;

CREATE TYPE [dbo].[MyTableType] AS TABLE
(
    [ID] int NOT NULL, PRIMARY KEY CLUSTERED ( [ID])
)

如何通过查询获取列[ID]

似乎只能找到真实表的主键,而不是表类型。

【问题讨论】:

  • 链接的问题根本不涉及 UDT。这很可能另一个问题的重复
  • @PanagiotisKanavos 我没有找到,这就是我问它的原因
  • @PanagiotisKanavos 我指定的是因为很多人会简单地将其标记为重复
  • 那么不要发布指向无关问题的链接。此外,INFORMATION_SCHEMA 视图已被弃用。你检查了sys.tablessys.key_constraints 视图吗?如果您可以从那里找到信息,那么这是询问有关主键的任何问题的副本,并且答案包含sys.key_constraints
  • @PanagiotisKanavos 是的,我确实检查了很多系统。????表来尝试查找 UDT 的主键(列名)

标签: sql-server tsql


【解决方案1】:

这存储在目录视图中:

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';

【讨论】:

    【解决方案2】:

    用户定义的表不是实际的表,因此它在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 您在之后添加了该要求我发布了答案
    • 查看编辑历史记录,它是在原始问题上指定的,在第一行带有(列名)
    猜你喜欢
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 2016-05-29
    • 1970-01-01
    相关资源
    最近更新 更多