2013-07-22 17 views
2

我想識別數據庫中所有表中所有屬於PK(複合或非複合)部分的列。我怎樣才能做到這一點與SQL語句?預期結果集:識別整個數據庫中包含在複合PK中的所有列

表名稱| COLUMN NAME |數據類型| CONSTRAINT |

+0

你試圖尋找到SYS.INDEXES表? PK有index_id 1,列可以與其他系統表映射。 –

+2

@DavidSöderlund - 不,他們沒有 - 聚集索引的index_id是1.雖然大多數PK都是瘋狂聚集的,但兩者是不同的概念。 –

+0

對,你太快了。 –

回答

2

在Sql Server中存在一個系統視圖來顯示所有約束。

試試這個:

select * from sys.key_constraints where type_desc = 'PRIMARY_KEY_CONSTRAINT' 
+0

這只是一個半答案。 OP想知道如何在約束中獲取列名,而不僅僅是約束本身。 –

0

事情是這樣的:

select 
    t.name as [TABLE NAME], 
    c.name as [COLUMN NAME], 
    ty.name as [DATA TYPE], 
    i.name as [CONSTRAINT] 
from sys.index_columns ic 
join sys.indexes i 
    on ic.object_id = i.object_id 
    and ic.index_id = i.index_id 
join sys.columns c 
    on ic.object_id = c.object_id 
    and ic.column_id = c.column_id 
join sys.tables t 
    on ic.object_id = t.object_id 
join sys.types ty 
    on c.user_type_id = ty.user_type_id 
where i.is_primary_key = 1 
0

我的文件夾不久前複製到我的這個片段,所以我不能把它的信用,但這種效果很好。 ..

select s.name as TABLE_SCHEMA, t.name as TABLE_NAME, k.name as CONSTRAINT_NAME, c.name as COLUMN_NAME, ic.key_ordinal AS ORDINAL_POSITION 
    from sys.key_constraints as k 
    join sys.tables as t 
    on t.object_id = k.parent_object_id 
    join sys.schemas as s 
    on s.schema_id = t.schema_id 
    join sys.index_columns as ic 
    on ic.object_id = t.object_id 
    and ic.index_id = k.unique_index_id 
    join sys.columns as c 
    on c.object_id = t.object_id 
    and c.column_id = ic.column_id 
where k.type = 'PK'; 
0
SELECT o.name AS TableName, c.Name AS ColumnName, t.name AS DataType, kc.name AS ContraintName 
FROM sys.key_constraints kc 
INNER JOIN sys.index_columns ic ON kc.parent_object_id = ic.object_id AND kc.unique_index_id = ic.index_id 
INNER JOIN sys.columns c ON ic.column_id = c.column_id AND c.object_id = ic.object_id 
INNER JOIN sys.objects o ON ic.object_id = o.object_id 
INNER JOIN sys.types t ON c.system_type_id = t.system_type_id AND c.user_type_id = t.user_type_id 
WHERE kc.type = 'PK' 
ORDER BY TableName,ic.key_ordinal 
相關問題