@@IDENTITY(Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Microsoft Fabric 中的 SQL 数据库

@@IDENTITY 是返回最后插入单位值的系统函数。

Transact-SQL 语法约定

语法

@@IDENTITY  

返回类型

numeric(38,0)

备注

完成 INSERTSELECT INTO或批量复制语句后,包含 @@IDENTITY 语句生成的最后一个身份值。

  • 如果该语句不影响任何带有同一列的表,则 @@IDENTITY 返回 NULL
  • 如果插入多行,生成多个身份值,返回 @@IDENTITY 最后生成的身份值。
  • 如果语句触发一个或多个触发器执行生成身份值的插入,语句后立即调用 @@IDENTITY 返回由触发器生成的最后一个身份值。
  • 如果在插入作后触发触发,且该触发器插入另一个没有身份列的表, @@IDENTITY 则返回第一个插入的同一元值。 如果 INSERT or SELECT INTO 语句或批量副本失败,或者交易被回滚,值@@IDENTITY不会恢复到之前的设置。

如果语句和事务失败,它们会更改表的当前标识,从而使标识列中的值出现不连贯现象。 即使未提交试图向表中插入值的事务,也永远无法回滚标识值。 例如,如果INSERT语句因 IGNORE_DUP_KEY 违规而失败,表当前的身份值仍然会被递增。

@@IDENTITYSCOPE_IDENTITYIDENT_CURRENT 是类似的函数,因为它们都返回了插入 IDENTITY 到表列中的最后一个值。

  • @@IDENTITYSCOPE_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