Sql 识别整个数据库中复合PK中包含的所有列
我想识别数据库中所有表中PK(复合或非复合)的所有列。如何使用sql语句实现这一点?期望结果集:Sql 识别整个数据库中复合PK中包含的所有列,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我想识别数据库中所有表中PK(复合或非复合)的所有列。如何使用sql语句实现这一点?期望结果集: Sql Server中的表名|列名|数据类型|约束|存在一个显示所有约束的系统视图 试试这个: select * from sys.key_constraints where type_desc = 'PRIMARY_KEY_CONSTRAINT' 大概是这样的: select t.name as [TABLE NAME], c.name as [COLUMN NAME],
Sql Server中的表名|列名|数据类型|约束|存在一个显示所有约束的系统视图 试试这个:
select * from sys.key_constraints where type_desc = 'PRIMARY_KEY_CONSTRAINT'
大概是这样的:
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';
您是否尝试查看sys.indexes表?PK的索引id为1,列可以与其他系统表映射。@DavidSöderlund-不,它们没有-聚集索引的索引id为1。虽然大多数PK都聚集在野外,但这两个概念是不同的。没错,我太快了。这只是半个答案。OP想知道如何获取约束中的列名,而不仅仅是约束本身。
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