Как я могу найти, какие целочисленные первичные ключи в моей БД НЕ помечены как автоинкремент? - PullRequest
1 голос
/ 23 января 2012

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

1 Ответ

2 голосов
/ 24 января 2012

Попробуйте:

SELECT 
pk_column_name = c.name,
table_name = o.name
FROM sys.indexes AS i
INNER JOIN sys.index_columns AS ic 
    ON i.object_id = ic.object_id AND i.index_id = ic.index_id
INNER JOIN sys.syscolumns c 
    ON ic.object_id = c.id AND COL_NAME(ic.object_id, ic.column_id) = c.name
INNER JOIN sys.sysobjects o
    ON o.id = c.id
WHERE i.is_primary_key = 1 -- the column is part of a primary key
 AND c.status < 128 -- the column is NOT identity enabled
 AND o.xtype = 'U' -- the object is a user table
 AND c.xtype = 56 -- the column type is int

Я включаю столбцы типа int.Если вы также хотите включить такие типы, как smallint, вы можете посмотреть его тип xtype, выполнив select в sys.systypes DMV:

SELECT name, xtype FROM sys.systypes

Вот альтернативный способ сделать это с помощью представлений информационной схемы:

SELECT 
pk_column_name = c.COLUMN_NAME,
table_name = c.TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS c
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS k
ON c.TABLE_NAME = k.TABLE_NAME
AND c.TABLE_SCHEMA = k.TABLE_SCHEMA
AND c.TABLE_CATALOG = k.TABLE_CATALOG
AND c.COLUMN_NAME = k.COLUMN_NAME
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS const
ON k.TABLE_NAME = const.TABLE_NAME
AND k.CONSTRAINT_CATALOG = const.CONSTRAINT_CATALOG
AND k.CONSTRAINT_SCHEMA = const.CONSTRAINT_SCHEMA
AND k.CONSTRAINT_NAME = const.CONSTRAINT_NAME
WHERE COLUMNPROPERTY(OBJECT_ID(c.TABLE_NAME), c.COLUMN_NAME, 'IsIdentity') = 0
AND const.CONSTRAINT_TYPE = 'PRIMARY KEY'
AND c.DATA_TYPE = 'int'

Надеюсь, это поможет.Обратите внимание, что это работает только для SQL Server 2005 и выше.

...