Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 识别整个数据库中复合PK中包含的所有列_Sql_Sql Server_Sql Server 2008_Tsql - Fatal编程技术网

Sql 识别整个数据库中复合PK中包含的所有列

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],

我想识别数据库中所有表中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],
    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