2016-04-25 65 views
2

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

ex;

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

如何使用查询

得到列[ID]这似乎是唯一可能找到真正的表,而不是表类型的主键。

+0

链接的问题没有解决的UDT的。最有可能这*是*另一个问题 –

+0

@PanagiotisKanavos我没有找到一个,这就是为什么我问它 – Fredou

+0

@PanagiotisKanavos我指定,因为很多人会简单地将它标记为重复 – Fredou

回答

2

这是存储在目录中的观点:

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.key_constraints检索与其他表,如果使用sys.table_types.type_table_object_idsys.key_constraints.parent_object_id领域,如:

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 [email protected] 

-- 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 [email protected] 

或者

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' 
+0

这个还是不给我列名 – Fredou

+0

@Fredou你在*后添加了那个要求*我发布了回答 –

+0

看看编辑历史,它是在原始问题上指定的,在第一行用**(列名称)** – Fredou

相关问题