Где 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' )

Однако приведенный выше запрос возвращает только один столбец. Это только я?

(Примечание: мне пришлось несколько изменить этот вопрос по сравнению с его более ранней версией.)

Пожалуйста, дайте нам пример базы данных с 2-3 строками в каждой связанной таблице.

Adam Davis 21.10.2008 00:43

Спасибо за подсказку ... как видите, мне пришлось изменить вопрос, когда я заметил, что эти поля вообще не возвращаются. Результаты будут одинаковыми независимо от того, есть ли в таблице-образце строки или нет.

harpo 21.10.2008 00:56

Теперь, когда вы отредактировали свой вопрос, мой ответ не имеет смысла. : D Но я рад, что вы нашли ответ.

BoltBait 21.10.2008 01:08
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
908
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

Ответ принят как подходящий

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

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

Нет, потому что это вернет только столбцы идентификаторов. Мне нужны все столбцы и только те расширенные свойства, когда они доступны.

harpo 21.10.2008 00:50

Что ж, когда я запускаю ваш исходный запрос, он работает нормально. Я думал, вы хотите удалить из вывода все столбцы, не являющиеся идентичными.

BoltBait 21.10.2008 00:52

Я сказал «отлично работает», потому что когда я запускаю ваш запрос в своей небольшой базе данных, он возвращает более 400 строк, включая поля моей идентификации. Данные были возвращены, как ожидалось, нулевым, если это не столбец идентификаторов, и заполненными, когда это было. Что вы ищете? Пример, пожалуйста.

BoltBait 21.10.2008 00:58

Думаю, это то, что я хотел узнать. Он должен работать так, как вы описали. (Изначально я оставил фильтр таблицы, чтобы упростить пример.) Итак, я думаю, что что-то не так с моей копией SQL Server.

harpo 21.10.2008 00:59

Похоже на меня. Если у вас есть «выберите col1, col2, col3 из ...», вам лучше вернуть 3 столбца!

BoltBait 21.10.2008 01:01

Ладно, извините за всю суету. Оказалось, проблема в моей консоли. Я использовал простую веб-консоль, связанную с сеткой данных, для такого рода вещей в течение многих лет, и раньше у меня никогда не было этой проблемы. Я запустил SQL Management Studio и получил правильный результат.

harpo 21.10.2008 01:03

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

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

ВЫБРАТЬ c.name, i.seed_value, i.increment_value ИЗ sys.columns c ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ sys.identity_columns i ВКЛ i.object_id = c.object_id И i.column_id = c.column_id Где I.seed_value не равно нулю

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

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

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