Я собираю метаданные с помощью представлений 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' )
Однако приведенный выше запрос возвращает только один столбец. Это только я?
(Примечание: мне пришлось несколько изменить этот вопрос по сравнению с его более ранней версией.)
Спасибо за подсказку ... как видите, мне пришлось изменить вопрос, когда я заметил, что эти поля вообще не возвращаются. Результаты будут одинаковыми независимо от того, есть ли в таблице-образце строки или нет.
Теперь, когда вы отредактировали свой вопрос, мой ответ не имеет смысла. : D Но я рад, что вы нашли ответ.





Вы уверены, что используете это в базе данных с таблицами со столбцами 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
Нет, потому что это вернет только столбцы идентификаторов. Мне нужны все столбцы и только те расширенные свойства, когда они доступны.
Что ж, когда я запускаю ваш исходный запрос, он работает нормально. Я думал, вы хотите удалить из вывода все столбцы, не являющиеся идентичными.
Я сказал «отлично работает», потому что когда я запускаю ваш запрос в своей небольшой базе данных, он возвращает более 400 строк, включая поля моей идентификации. Данные были возвращены, как ожидалось, нулевым, если это не столбец идентификаторов, и заполненными, когда это было. Что вы ищете? Пример, пожалуйста.
Думаю, это то, что я хотел узнать. Он должен работать так, как вы описали. (Изначально я оставил фильтр таблицы, чтобы упростить пример.) Итак, я думаю, что что-то не так с моей копией SQL Server.
Похоже на меня. Если у вас есть «выберите col1, col2, col3 из ...», вам лучше вернуть 3 столбца!
Ладно, извините за всю суету. Оказалось, проблема в моей консоли. Я использовал простую веб-консоль, связанную с сеткой данных, для такого рода вещей в течение многих лет, и раньше у меня никогда не было этой проблемы. Я запустил SQL Management Studio и получил правильный результат.
Вам не хватает предложения 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)
Пожалуйста, дайте нам пример базы данных с 2-3 строками в каждой связанной таблице.