Есть ли в SQL Server представление, в котором перечислены только первичные ключи? - PullRequest
3 голосов
/ 20 сентября 2010

Я работаю с SQL Server и пытаюсь сделать небольшое «отражение», если хотите.Я обнаружил системное представление sys.identity_columns, которое содержит все столбцы идентификаторов для всех моих таблиц.

Однако мне нужно иметь возможность выбирать информацию о первичных ключах, которые не являются столбцами идентификаторов.Существует ли представление, содержащее данные обо всех первичных ключах и только первичных ключах?Если нет, как еще я могу получить эти данные?

Ответы [ 4 ]

7 голосов
/ 20 сентября 2010

Это работает для SQL Server 2005 и выше:

select OBJECT_SCHEMA_NAME(i.object_id), OBJECT_NAME(i.object_id), i.name
from sys.indexes i
where i.is_primary_key = 1
order by 1, 2, 3
3 голосов
/ 21 сентября 2010
SELECT name FROM sys.key_constraints WHERE type = 'PK';
SELECT name FROM sys.key_constraints WHERE type = 'UQ';
1 голос
/ 12 апреля 2014

Попробуйте это ...

SELECT KC.TABLE_NAME, KC.COLUMN_NAME, KC.CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE KC
WHERE OBJECTPROPERTY(OBJECT_ID(KC.CONSTRAINT_NAME), 'IsPrimaryKey') = 1
AND COLUMNPROPERTY(object_id(TABLE_NAME), COLUMN_NAME, 'IsIdentity') = 0
1 голос
/ 11 апреля 2014

Я понимаю, что вопрос уже помечен как ответивший, но некоторым также может быть полезно показать, как включить sys.index_columns (в дополнение к sys.indexes) в ваш запрос, чтобы связать фактический первичный ключиндекс для столбцов таблицы.пример:

select
    t.Name as tableName
    ,c.name as columnName
    ,case when pk.is_primary_key is not null then 1 else 0 end as isPrimaryKeyColumn
from sys.tables t
inner join sys.columns c on t.object_id = c.object_id
left join sys.index_columns pkCols 
    on t.object_id = pkCols.object_id 
    and c.column_id = pkCols.column_id
left join sys.indexes pk 
    on pkCols.object_id = pk.object_id 
    and pk.is_primary_key = 1
where 
    t.name = 'MyTable'
...