2017-06-05 77 views
1

我正在查找可以通过特定数据库上的指定键/键名称检索所有表的查询。 事情是这样的:查找数据库中的所有表按主键

SELECT table_name 
FROM information_Schema.columns 
WHERE column_name='ID_UNICO' 
AND Constraint_Type = 'PRIMARY KEY' 

我一直在寻找,我能找到的最好的是:

SELECT Col.Column_Name from 
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS Tab, 
    INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE Col 
WHERE 
    Col.Constraint_Name = Tab.Constraint_Name 
    AND Col.Table_Name = Tab.Table_Name 
    AND Constraint_Type = 'PRIMARY KEY' 
    AND Col.Table_Name = '<your table name>' 

这个检索特定表的PK的,我想找到table_name的BY PK名称。

SELECT table_name 
FROM information_Schema.columns 
WHERE column_name='ID_UNICO' 
and ordinal_position = 1; 

也发现了这个,但是这给了我表中的第一列,它不能保证我它是PK。

找不到任何重复。

回答

1

您可以使用此查询。将“YOUR_COLUMN_NAME”替换为您的主键列名称。

SELECT Table_Name 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE OBJECTPROPERTY(OBJECT_ID(CONSTRAINT_SCHEMA + '.' + QUOTENAME(CONSTRAINT_NAME)), 'IsPrimaryKey') = 1 
and COLUMN_NAME ='YOUR_COLUMN_NAME' 
+0

谢谢你的帮助,简单又简单!必须将其设置为最佳答案,因为它实际上较不复杂 –

+0

不客气!我很乐意提供帮助。 –

2

这会适合你吗?

DECLARE @ColName AS VARCHAR(MAX) 
SET @ColName = 'CourseId' 
SELECT 
    TABLE_NAME 
FROM 
    INFORMATION_SCHEMA.COLUMNS 
WHERE 
    COLUMNPROPERTY(OBJECT_ID(TABLE_SCHEMA + '.' + TABLE_NAME), COLUMN_NAME, 'IsIdentity') = 1 
    AND COLUMN_NAME = @ColName 
+0

谢谢你的工作原理像预期的一样! –

1

在这里你去,加入到TABLE_CONSTRAINTS到CONSTRAINT_COLUMN_USAGE约束名扎到列然后返回你的TABLE_NAME:

SELECT CCU.COLUMN_NAME, 
     CONS.TABLE_NAME 
FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE CCU 
     JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS CONS 
     ON CONS.CONSTRAINT_NAME = CCU.CONSTRAINT_NAME 
WHERE CONS.CONSTRAINT_TYPE = 'PRIMARY KEY' 
     AND CCU.COLUMN_NAME = 'ID_UNICO' 
+0

谢谢你的好解决方案! –