Где находятся seed_value и increment_value для столбцов идентификаторов?
-
03-07-2019 - |
Вопрос
Я собираю метаданные, используя представления sys.*, и, согласно документации, представление sys.identity_columns вернет начальные значения и увеличит их примерно так.
CREATE TABLE ident_test (
test_id int IDENTITY(1000,10),
other int
)
SELECT name, seed_value, increment_value
FROM sys.identity_columns
WHERE object_id = OBJECT_ID( 'ident_test' )
Однако приведенный выше запрос возвращает только один столбец.Это только из-за меня?
(Примечание:Мне пришлось несколько изменить этот вопрос по сравнению с его более ранней версией.)
Решение
Разве вы не должны поменять местами с и присоединиться, как это:
SELECT c.name, i.seed_value, i.increment_value
from sys.identity_columns i
join sys.columns c
ON i.object_id = c.object_id
AND i.column_id = c.column_id
Другие советы
Вам не хватает предложения Where.Ваш запрос фактически говорит: "Дайте мне все sys.columns и любые совпадающие строки из sys.identity_columns, которые у вас есть (но дайте мне null, если совпадающих строк нет)".
Добавив приведенное ниже предложение Where, вы измените его так, чтобы возвращать только там, где возвращается точное совпадение, что на самом деле совпадает с внутренним соединением в данном экземпляре.
ВЫБЕРИТЕ c.name, i.начальное значение, i.приращение_значения От sys.столбцы c ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ sys.identity_columns i НА i.object_id = c.object_id И i.column_id = c.column_id Где I.значение seed_value не равно null
Поэтому я думаю, что ваши данные верны, хотя результатов для просмотра нет.
Вы уверены, что запускаете это в базе данных с таблицами со столбцами IDENTITY
?
SELECT c.name, i.seed_value, i.increment_value
FROM sys.columns c
INNER JOIN sys.identity_columns i
ON i.object_id = c.object_id
AND i.column_id = c.column_id
Возвращает строки для меня в обычной производственной базе данных с несколькими удостоверениями.
Использование LEFT JOIN
возвращает эти строки, а также многие строки, которые не являются IDENTITY
Я запустил это в другой базе данных и заметил, что возвращаются некоторые NULL
(даже в случае INNER JOIN
). Это связано с тем, что некоторые столбцы находятся в VIEW
.
Попробуйте добавить:
INNER JOIN sys.tables t
ON t.object_id = c.object_id
Для фильтрации только по фактическим столбцам IDENTITY
в таблицах.
ваш запрос возвращает то, что я ожидал [см. ниже]; он возвращает одну строку метаданных об одном столбце идентификаторов (test_ID) в таблице (идент_тест), в другом столбце (прочее) нет метаданных в sys.identity_column, поскольку он не является идентификатором.
SELECT name, seed_value, increment_value FROM sys.identity_columns WHERE object_id = OBJECT_ID( 'ident_test' ) select name, is_identity, is_nullable from sys.columns WHERE object_id = OBJECT_ID( 'ident_test' )
Что дает
name seed_value increment_value ----------------------------------------- test_id 1000 10 (1 row(s) affected) name is_identity is_nullable ------------------------------------- test_id 1 0 other 0 1 (2 row(s) affected)