Использование @@ IDENTITY в SQL для конкретной таблицы - PullRequest
2 голосов
/ 06 января 2010

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

Я делал

select * from myTable 

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

select @@IDENTITY as identt

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

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

В myTable для столбца идентификатора установлено значение «Первичный ключ» и автоматическое увеличение.

Ответы [ 5 ]

9 голосов
/ 06 января 2010

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

IDENT_CURRENT( 'table_name' )

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

6 голосов
/ 06 января 2010

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

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

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

2 голосов
/ 06 января 2010

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

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

1 голос
/ 06 января 2010

Я никогда не знал, что @@ IDENTITY будет использоваться таким образом, я только когда-либо использовал его для доступа к идентификатору вновь вставленной записи.

0 голосов
/ 06 января 2010

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

У вас есть две таблицы: Order (первичный ключ: OrderID), OrderDetails (внешний ключ: OrderID)

Вы выполняете INSERT INTO Заказать ЗНАЧЕНИЯ ( «Подушка») - Обратите внимание, что OrderId не упоминается в значениях, поскольку это автоматический номер (первичный ключ)

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

Следовательно, ваша вставка OderDetail будет работать примерно так: INSERT INTO OrderDetail ЦЕННОСТИ (@@ IDENTITY, «Мягкие подушки»)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...