Где находятся 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 дело). Это потому, что некоторые из столбцов находятся в VIEWs.

Попробуйте добавить:

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 не является нулевым

Поэтому я думаю, что ваши данные верны, но пока нет результатов для просмотра.

Другие вопросы по тегам