我想識別數據庫中所有表中所有屬於PK(複合或非複合)部分的列。我怎樣才能做到這一點與SQL語句?預期結果集:識別整個數據庫中包含在複合PK中的所有列
表名稱| COLUMN NAME |數據類型| CONSTRAINT |
我想識別數據庫中所有表中所有屬於PK(複合或非複合)部分的列。我怎樣才能做到這一點與SQL語句?預期結果集:識別整個數據庫中包含在複合PK中的所有列
表名稱| COLUMN NAME |數據類型| CONSTRAINT |
在Sql Server中存在一個系統視圖來顯示所有約束。
試試這個:
select * from sys.key_constraints where type_desc = 'PRIMARY_KEY_CONSTRAINT'
這只是一個半答案。 OP想知道如何在約束中獲取列名,而不僅僅是約束本身。 –
事情是這樣的:
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
我的文件夾不久前複製到我的這個片段,所以我不能把它的信用,但這種效果很好。 ..
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';
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
你試圖尋找到SYS.INDEXES表? PK有index_id 1,列可以與其他系統表映射。 –
@DavidSöderlund - 不,他們沒有 - 聚集索引的index_id是1.雖然大多數PK都是瘋狂聚集的,但兩者是不同的概念。 –
對,你太快了。 –