@@IDENTITY (Transact-SQL)

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

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

Соглашения о синтаксисе 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 AdventureWorks2022;  
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  

См. также

Системные функции (Transact-SQL)
CREATE TABLE (Transact-SQL)
IDENT_CURRENT (Transact-SQL)
INSERT (Transact-SQL)
SCOPE_IDENTITY (Transact-SQL)
SELECT (Transact-SQL)