Я знаю Scope_Identity()
, Identity()
, @@Identity
и Ident_Current()
все получить значение столбца идентификации, но я хотел бы знать разницу.
Часть противоречия, которое я имею, состоит в том, что они подразумевают под областью применения применительно к этим функциям выше?
Я также хотел бы простой пример различных сценариев их использования?
sql
sql-server
identity
Tebo
источник
источник
Ответы:
@@identity
Функция возвращает последний идентификатор , созданный на той же сессии.scope_identity()
Функция возвращает последний идентификатор , созданный на той же сессии и той же области.ident_current(name)
Возвращает последний идентификатор , созданный для определенной таблицы или представления в любой сессии.identity()
Функция не используется , чтобы получить идентичность, он используется для создания идентичности вselect...into
запросе.Сеанс - это соединение с базой данных. Область действия - текущий запрос или текущая хранимая процедура.
Ситуация , когда
scope_identity()
и@@identity
функции отличаются, если у вас есть триггер на столе. Если у вас есть запрос, который вставляет запись, в результате чего триггер вставляет куда-то еще одну запись,scope_identity()
функция возвращает идентификатор, созданный запросом, а@@identity
функция возвращает идентификатор, созданный триггером.Итак, обычно вы бы использовали эту
scope_identity()
функцию.источник
Хороший вопрос.
@@IDENTITY
: возвращает последнее значение идентификатора, сгенерированное в вашем соединении SQL (SPID). В большинстве случаев это будет то, что вы хотите, но иногда это не так (например, когда триггер срабатывает в ответ наINSERT
, а триггер выполняет другойINSERT
оператор).SCOPE_IDENTITY()
: возвращает последнее значение идентификатора, сгенерированное в текущей области (т.е. хранимая процедура, триггер, функция и т. д.).IDENT_CURRENT()
: возвращает последнее значение идентификатора для конкретной таблицы. Не используйте это для получения значения идентификатора изINSERT
, это зависит от условий гонки (то есть несколько соединений вставляют строки в одну таблицу).IDENTITY()
: используется при объявлении столбца в таблице как столбца идентификаторов.Для получения дополнительной информации см .: http://msdn.microsoft.com/en-us/library/ms187342.aspx .
Подводя итог: если вы вставляете строки, и вы хотите знать значение столбца идентификаторов для строки вы только что вставили, всегда использовать
SCOPE_IDENTITY()
.источник
Если вы понимаете разницу между областью действия и сессией, то эти методы будут очень легко понять.
Очень хорошая запись в блоге Адама Андерсона описывает эту разницу:
Таким образом, различия между тремя методами поиска идентичности заключаются в следующем:
источник
Область действия означает контекст кода, который выполняет
INSERT
операторSCOPE_IDENTITY()
, в отличие от глобальной области действия@@IDENTITY
.Дает разные результаты.
источник
Чтобы уточнить проблему с
@@Identity
:Например, если вы вставляете таблицу, и эта таблица имеет триггеры, выполняющие вставки,
@@Identity
вернет идентификатор из вставки в триггере (alog_id
или что-то еще), аscope_identity()
вернет идентификатор из вставки в исходной таблице.Так что если у вас нет никаких триггеров,
scope_identity()
и вы@@identity
получите то же значение. Если у вас есть триггеры, вам нужно подумать, какую ценность вы бы хотели.источник
Scope Identity
: Идентификатор последней записи, добавленной в выполняемую хранимую процедуру.@@Identity
: Идентификация последней записи, добавленной в пакете запроса, или в результате запроса, например, процедура, которая выполняет вставку, затем запускает триггер, который затем вставляет запись, возвращает идентификатор вставленной записи из триггера.IdentCurrent
: Последний идентификатор, выделенный для таблицы.источник
Вот еще одно хорошее объяснение из книги :
источник