@@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)