2016-04-25 62 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

相關問題