Поделиться через


@@IDENTITY (Transact-SQL)

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

Значок ссылки на разделСинтаксические обозначения в Transact-SQL

Синтаксис

@@IDENTITY

Типы возвращаемых данных

numeric(38,0)

Замечания

После завершения инструкций INSERT, SELECT INTO или массового копирования функция @@IDENTITY возвращает последнее значение идентификатора, сформированное инструкцией. Если инструкция не обработала ни одной таблицы, содержащей столбцы идентификаторов, функция @@IDENTITY возвращает значение NULL. Когда при вставлении нескольких строк формируется несколько значений идентификаторов, функция @@IDENTITY возвращает последнее сформированное значение. Если в результате инструкции срабатывает один или несколько триггеров, которые выполняют вставки, формирующие значения идентификаторов, вызов функции @@IDENTITY сразу же после завершения инструкции возвращает последнее значение идентификатора, сформированное триггерами. Если триггер срабатывает после выполнения вставки в таблицу, содержащую столбец идентификаторов и триггер производит вставку в другую таблицу, в которой не содержится столбец идентификаторов, функция @@IDENTITY возвращает значение идентификатора первой вставки. Предыдущее значение @@IDENTITY не восстанавливается, если инструкции INSERT, SELECT INTO или массового копирования завершились ошибкой либо если выполняется откат транзакции.

Инструкции и транзакции, завершившиеся ошибкой, могут изменять текущий идентификатор таблицы и вызывать появление пропусков в значениях столбца идентификаторов. Откат значения идентификатора не производится никогда, несмотря на то, что транзакция, пытавшаяся вставить в таблицу значение, не была зафиксирована. Например, если инструкция INSERT привела к ошибке из-за нарушения ограничения IGNORE_DUP_KEY, текущее значение идентификатора для таблицы все равно увеличивается.

Функции @@IDENTITY, SCOPE_IDENTITY и IDENT_CURRENT похожи, поскольку все они возвращают последнее значение, вставленное в столбец IDENTITY таблицы.

Функции @@IDENTITY и SCOPE_IDENTITY возвращают последнее значение идентификатора, сформированное в любой таблице в текущем сеансе. Однако функция SCOPE_IDENTITY возвращает значение только в пределах текущей области, в то время как функция @@IDENTITY не ограничена определенной областью.

Функция IDENT_CURRENT не ограничена областью действий и сеансом, но ограничена указанной таблицей. Функция IDENT_CURRENT возвращает значение идентификатора, сформированное для определенной таблицы в любом сеансе и в любой области. Дополнительные сведения см. в разделе IDENT_CURRENT (Transact-SQL).

Областью функции @@IDENTITY является текущий сеанс на локальном компьютере, на котором она выполняется. Эту функцию невозможно применить к удаленным или связанным серверам. Чтобы получить значение идентификатора на другом сервере, выполните хранимую процедуру на удаленном или связанном сервере и используйте эту хранимую процедуру (которая выполняется в контексте удаленного или связанного сервера) для сбора значения идентификатора и его возврата вызывающему соединению на локальном сервере.

Репликация может затронуть значение системной переменной @@IDENTITY, поскольку она используется в триггерах и хранимых процедурах репликации. Функция @@IDENTITY не является надежным признаком последнего созданного пользователем идентификатора, если столбец является частью статьи репликации. Вместо @@IDENTITY можно использовать функцию SCOPE_IDENTITY(). Дополнительные сведения см. в разделе SCOPE_IDENTITY (Transact-SQL).

ПримечаниеПримечание

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

Примеры

Следующий пример вставляет строку в таблицу, содержащую столбец идентификаторов (LocationID), и применяет функцию @@IDENTITY для отображения значения идентификатора, используемого в новой строке.

USE AdventureWorks;
GO
--Display the value of LocationID in the last row in the table.
SELECT MAX(LocationID) FROM Production.Location;
GO
INSERT INTO Production.Location (Name, CostRate, Availability, ModifiedDate)
VALUES ('Damaged Goods', 5, 2.5, GETDATE());
GO
SELECT @@IDENTITY AS 'Identity';
GO
--Display the value of LocationID of the newly inserted row.
SELECT MAX(LocationID) FROM Production.Location;
GO