Причина использования @@ identity, а не scope_identity - PullRequest
11 голосов
/ 09 декабря 2008

В базе данных SQL Server 2005 один из наших удаленных разработчиков только что зарегистрировал изменение в хранимой процедуре, которое изменило «select scope_identity» на «select @@ identity». Знаете ли вы какие-либо причины, по которым вы бы использовали @@ identity вместо scope_identity?

Ответы [ 5 ]

18 голосов
/ 09 декабря 2008

@@IDENTITY вернет последнее значение идентификатора, выданное текущим сеансом. SCOPE_IDENTITY() возвращает последнее значение идентификатора в текущем сеансе и ту же область. Они обычно одинаковы, но предполагают, что вызван триггер, который вставил что-то где-то перед текущим оператором @@IDENTITY вернет значение идентификатора оператором INSERT триггера, а не оператором вставки блока. Обычно это ошибка, если он не знает, что делает.

12 голосов
/ 09 декабря 2008

Вот ссылка , которая может помочь их дифференцировать

выглядит так:

  • IDENTITY - последний идентификатор на соединении
  • SCOPE_IDENTITY - последняя личность, которую вы явно создали (исключая триггеры)
  • IDENT_CURRENT ('' имя таблицы '') - последняя личность в таблице независимо от области действия или соединения.
2 голосов
/ 09 декабря 2008

Я не могу думать ни о каком другом, если не было триггера, который затем вставил строку (или что-то подобное), и я действительно действительно хотел идентификатор этой вставленной в триггер строки, а не строку, которую я физически изменил.

Другими словами, нет, не совсем.

  • ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Не эксперт по T-SQL:)
1 голос
/ 09 декабря 2008

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

0 голосов
/ 09 декабря 2008

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

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