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


@@IDENTITY (Transact-SQL)

Применимо к:SQL ServerБаза данных SQL AzureУправляемый экземпляр SQL AzureБаза данных SQL в Microsoft Fabric

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

Соглашения о синтаксисе Transact-SQL

Синтаксис

@@IDENTITY  

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

numeric(38,0)

Замечания

После завершения INSERTSELECT 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 не является надёжным индикатором самой последней пользовательской идентичности, если столбец является частью статьи по репликации. Можно использовать синтаксис SCOPE_IDENTITY() функций вместо @@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