Где находятся seed_value и increment_value для столбцов IDENTITY?
Я собираю метаданные с использованием представлений 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' )
Однако приведенный выше запрос возвращает только один столбец. Это только я?
(Примечание: мне пришлось несколько изменить этот вопрос по сравнению с его более ранней версией.)
4 ответа
Не следует ли вам отменить и присоединиться, как это:
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
Вы уверены, что запускаете это в базе данных с таблицами с 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
s.
Попробуйте добавить:
INNER JOIN sys.tables t
ON t.object_id = c.object_id
Фильтровать только к актуальным IDENTITY
столбцы в таблицах.
Ваш запрос возвращает то, что я ожидал [см. ниже]; он возвращает единственную строку метаданных об одном столбце идентификаторов (test_ID) в таблице (идент_тест), в другом столбце (other) нет метаданных в sys.identity_column, поскольку он не является идентификатором.
ВЫБЕРИТЕ имя, seed_value, increment_value FROM sys.identity_columns WHERE object_id = OBJECT_ID( 'ident_test') выберите имя, is_identity, is_nullable из sys.columns WHERE object_id = OBJECT_ID( 'ident_test')
Который дает
имя seed_value increment_value ----------------------------------------- test_id 1000 10 (Затронут 1 ряд) имя is_identity is_nullable ------------------------------------- test_id 1 0 другое 0 1 (Затронуты 2 строки)
Вы пропустили пункт Где. Ваш запрос фактически говорит: "Дайте мне все sys.columns и все соответствующие строки из sys.identity_columns, которые у вас есть (но дайте мне ноль, если нет соответствующих строк)".
Добавив предложение Where ниже, вы измените его на возвращение только в том случае, если возвращается точное совпадение, которое на самом деле совпадает с внутренним соединением в этом случае.
SELECT c.name, i.seed_value, i.increment_value FROM sys.columns c ВНЕШНЕЕ ВНЕШНЕЕ СОЕДИНЕНИЕ sys.identity_columns i ON i.object_id = c.object_id AND i.column_id = c.column_id Где I.seed_value не является нулевым
Поэтому я думаю, что ваши данные верны, но пока нет результатов для просмотра.