В чем разница между Scope_Identity(), Identity(), @@Identity и Ident_Current()?

Я знаю Scope_Identity(), Identity(), @@Identity и Ident_Current() все получают значение столбца идентификации, но я бы хотел узнать разницу.

Часть разногласий, которые у меня есть, - это то, что они подразумевают под областью действия применительно к этим функциям выше?

Мне также понравился бы простой пример различных сценариев их использования?

Ответ 1

  • Функция @@identity возвращает последний идентификатор, созданный в том же сеансе.
  • Функция scope_identity() возвращает последний идентификатор, созданный в том же сеансе и той же области.
  • ident_current(name) возвращает последний идентификатор, созданный для конкретной таблицы или просмотра в любом сеансе.
  • Функция identity() не используется для получения идентификатора, она использовалась для создания идентификатора в запросе select...into.

Сессия - это соединение с базой данных. Область - текущий запрос или текущая хранимая процедура.

Ситуация, в которой функции scope_identity() и @@identity различаются, есть, если у вас есть триггер в таблице. Если у вас есть запрос, который вставляет запись, заставляя триггер где-то вставить другую запись, функция scope_identity() вернет идентификатор, созданный запросом, а функция @@identity вернет идентификатор, созданный триггером.

Итак, обычно вы используете функцию scope_identity().

Ответ 2

Хороший вопрос.

  • @@IDENTITY: возвращает последнее значение идентификации, сгенерированное в вашем SQL-соединении (SPID). В большинстве случаев это будет то, что вы хотите, но иногда это не так (например, когда триггер запускается в ответ на INSERT, а триггер выполняет другой оператор INSERT).

  • SCOPE_IDENTITY(): возвращает последнее значение идентификации, сгенерированное в текущей области (то есть хранимая процедура, триггер, функция и т.д.).

  • IDENT_CURRENT(): возвращает последнее значение идентификации для конкретной таблицы. Не используйте это, чтобы получить значение идентификатора от INSERT, оно подчиняется условиям гонки (т.е. Несколько соединений, вставляющих строки в одну и ту же таблицу).

  • IDENTITY(): используется при объявлении столбца в таблице в качестве столбца идентификации.

Подробнее см. http://msdn.microsoft.com/en-us/library/ms187342.aspx.

Подводя итог: если вы вставляете строки и хотите знать значение столбца идентификатора для строки you только что вставленной, всегда используйте SCOPE_IDENTITY().

Ответ 3

Scope означает контекст кода, который выполняет оператор INSERT SCOPE_IDENTITY(), в отличие от глобальной области @@IDENTITY.

CREATE TABLE Foo(
  ID INT IDENTITY(1,1),
  Dummy VARCHAR(100)
)

CREATE TABLE FooLog(
  ID INT IDENTITY(2,2),
  LogText VARCHAR(100)
)
go
CREATE TRIGGER InsertFoo ON Foo AFTER INSERT AS
BEGIN
  INSERT INTO FooLog (LogText) VALUES ('inserted Foo')
  INSERT INTO FooLog (LogText) SELECT Dummy FROM inserted
END

INSERT INTO Foo (Dummy) VALUES ('x')
SELECT SCOPE_IDENTITY(), @@IDENTITY 

Дает разные результаты.

Ответ 4

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

Очень приятный сообщение в блоге от Адама Андерсона описывает эту разницу:

Сессия означает текущее соединение, выполняющее команду.

Область означает непосредственный контекст команды. Каждый вызов хранимой процедуры выполняется в своей собственной области, а вложенные вызовы выполняются во вложенной области видимости в пределах области вызова. Аналогично, команда SQL, выполняемая из приложения или SSMS, выполняется в своей собственной области действия, и если эта команда запускает любые триггеры, каждый триггер выполняет свою собственную вложенную область.

Таким образом, различия между тремя методами поиска идентичности заключаются в следующем:

@@identity возвращает последнее значение идентификации, сгенерированное в этом сеансе, но любую область.

scope_identity() возвращает последнее значение идентификации, сгенерированное в этом сеансе и этой области.

ident_current() возвращает последнее значение идентификации, сгенерированное для конкретной таблицы, в любом сеансе и в любой области.

Ответ 5

Чтобы прояснить проблему с помощью @@Identity:

Например, если вы вставляете таблицу, и в этой таблице есть триггеры, выполняющие вставки, @@Identity вернет идентификатор из вставки в триггере (a log_id или что-то еще), а scope_identity() вернет идентификатор из вставить в исходную таблицу.

Итак, если у вас нет триггеров, scope_identity() и @@Identity вернут одно и то же значение. Если у вас есть триггеры, вам нужно подумать о том, какое значение вы бы хотели.

Ответ 6

Из-за ошибки, упомянутой @David Freitas, и из-за несовместимости с новой функцией Sequence, которая была введена в 2012 году, я бы рекомендовал держаться подальше от всех трех из них. Вместо этого вы можете использовать предложение OUTPUT для получения вставленного значения идентификатора. Другим преимуществом является то, что OUTPUT работает даже если вы вставили несколько строк.

Подробнее и примеры см. здесь: Кризис идентичности

Ответ 7

Scope Identity: идентификация последней записи, добавленной в исполняемой хранимой процедуре.

@@Identity: идентификация последней записи, добавленной в пакет запроса, или в результате запроса, например. процедура, которая выполняет вставку, затем запускает триггер, который затем вставляет запись, вернет идентификатор вставленной записи из триггера.

IdentCurrent: последний идентификатор, выделенный для таблицы.

Ответ 8

Вот еще одно хорошее объяснение из книга:

Что касается разницы между SCOPE_IDENTITY и @@IDENTITY, предположим, что у вас есть хранимая процедура P1 с тремя операторами:
- INSERT, который генерирует новое значение идентичности
- вызов хранимой процедуры P2, который также имеет инструкцию INSERT, которая генерирует новое значение идентификации
- инструкция, запрашивающая функции SCOPE_IDENTITY и @@IDENTITY Функция SCOPE_IDENTITY вернет значение, сгенерированное P1 (тот же сеанс и область действия). Функция @@IDENTITY вернет значение, сгенерированное P2 (тот же сеанс независимо от области действия).

Ответ 9

@@Identity - это глобальная переменная, используемая для получения последнего сгенерированного id во всем мире. Хотя scope_identity используется для получения последнего сгенерированного идентификатора в области (процедура или функция). Более подробную информацию см. По адресу: - @@Identity - это переменная globa, используемая для получения последнего сгенерированного id во всем мире. Хотя scope_identity используется для получения последнего сгенерированного идентификатора в области (процедура или функция). Подробнее см. По адресу: - http://interview-preparation-for-you.blogspot.com/2011/02/identity-and-scope-identity.html