Где находятся seed_value и increment_value для столбцов IDENTITY? - PullRequest
0 голосов
/ 21 октября 2008

Я собираю метаданные, используя представления 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 ]

1 голос
/ 21 октября 2008

Разве вы не должны поменять местами с и присоединиться, как это:

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
0 голосов
/ 21 октября 2008

ваш запрос возвращает то, что я ожидал [см. Ниже]; он возвращает одну строку метаданных об одном столбце идентификаторов (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)
0 голосов
/ 21 октября 2008

Вам не хватает предложения Where. Ваш запрос фактически говорит: «Дайте мне все sys.columns и все соответствующие строки из sys.identity_columns, которые у вас есть (но дайте мне ноль, если нет соответствующих строк)».

Добавив приведенное ниже предложение Where, вы измените его на возвращение только в том случае, если возвращается точное совпадение, которое на самом деле совпадает с внутренним соединением в этом случае.

ВЫБРАТЬ c.name, i.seed_value, i.increment_value ОТ sys.columns c ЛЕВОЕ НАРУЖНОЕ СОЕДИНЕНИЕ sys.identity_columns i ON i.object_id = c.object_id AND i.column_id = c.column_id Где I.seed_value не является нулевым

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

0 голосов
/ 21 октября 2008

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

...