2010-01-05 3 views
1

Как я могу получить @@ IDENTITY для конкретной таблицы?Использование @@ IDENTITY в SQL в определенной таблице

Я делал

select * from myTable 

, как я предполагаю, что это задает область, из того же окна запроса окна SQL в SSMS, то я бегу

select @@IDENTITY as identt 

возвращает identt в нуль, которое не является ожидаемый, поскольку myTable уже имеет много энтрий.

Я ожидаю, что он вернет следующий доступный идентификатор целого числа.

У myTable есть столбец идентификаторов, который установлен на Основной ключ и автоматический приращение.

ответ

8

Вы можете использовать IDENT_CURRENT

IDENT_CURRENT('table_name') 

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

+1

+1; Я думаю, что это единственный правильный ответ на этот вопрос. –

+0

+1 Это работает, даже если строки откатываются и т. Д. – Andrew

+1

Если вам нужно следующее значение идентификации, добавьте к нему значение IDENT_INCR ('table_name') – David

6

Вы можете по-настоящему использовать SELECT @@IDENTITY после вставки - последняя вставка в таблицу с столбцом IDENTITY - это значение, которое вы получите обратно.

Вы не можете «ограничить» его таблицей - значение в @@ IDENTITY - и, кстати, я бы настоятельно рекомендовал с помощью SCOPE_IDENTITY() вместо этого !! - это последнее значение для любого столбца IDENTITY, который был установлен.

Проблема с @@ IDENTITY заключается в том, что она сообщит о последнем значении IDENTITY, вставленном в любую таблицу, - если ваш INSERT в вашу таблицу данных вызовет, например, триггер для записи записи в таблицу аудита и что таблица аудита имеет поле IDENTITY, вы вернете это значение IDENTITY, а не те, которые были вставлены в вашу таблицу. SCOPE_IDENTITY() решает это.

1

Я никогда не знал @@ IDENTITY, чтобы использовать этот способ, я использовал его только для доступа к ID вновь вставленной записи.

2

IDENT_CURRENT делает, что вы хотите. Но не надо.

Это в дополнение к ответу marc_s'

0

Это правильно. @@ IDENTITY нельзя использовать так, как вы думаете. Его можно использовать только после INSERT в таблицу. Давайте рассмотрим это для сценария:

У вас есть две таблицы: Order (Primary Key: OrderId), ORDERDETAILS (Внешний ключ: OrderId)

Вы выполняете INSERT INTO Заказать VALUES ('Подушки') - - Обратите внимание, что OrderId не упоминается в значениях, поскольку это автоматический номер (первичный ключ)

Теперь вы хотите выполнить вставку в OrderDetail. Но вы не всегда помните, сколько записей было в таблице Order до того, как вы вставили запись для «Pillows», и, следовательно, вы не помните, какой последний PrimaryKey был вставлен в таблицу Order.Вы могли бы, но даже тогда вам не захочется особо указывать, чтобы вставить (скажем, OrderID 1), когда вы вставляете в таблицу OrderDetail.

Таким образом, ваш OderDetail вставка будет работать вроде как так: INSERT INTO OrderDetail ЗНАЧЕНИЯ (@@ IDENTITY, 'Мягкие подушки')

Надежда это объясняет пользователю @@ IDENTITY.

Смежные вопросы