Где находятся seed_value и increment_value для столбцов идентификаторов?

StackOverflow https://stackoverflow.com/questions/219833

Вопрос

Я собираю метаданные, используя представления 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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top