@@IDENTITY与SCOPE_IDENTITY()

来源:互联网 发布:教务管理系统数据库 编辑:程序博客网 时间:2024/05/29 14:54

  在一条Insert、select into或大量复制语句完成后,@@IDENTUTY中包含语句生成的最后一个标识值,如果语句未影响包含标识列的表,则@@IDENTITY返回NULL,如果插入了半个行,生成了多个标识值,则@@IDENTITY将返回最后生成的标识值。如果语句触发一个活多个触发器,该触发器又执行插入操作,那么在语句执行后 立即调用@@IDENTITY将返回触发器生成的最后一个标识值。如果对包含标识的列执行操作后插入了触发器。并且触发器对另外一个没有标识列的表执行了 插入操作,则@@IDENTITY将返回第一次插入的标识值。出现insert或select into语句失败或者大量复制失败,或者事务回滚情况下,@@INDETITY值不会恢复到以前的设置。

  如果语句和事务失败。他们会更改表的当前标识,从而使标识列中的值出现不连贯的现象。及时未提交视图向表中插入值的事务,也无法回滚标识值。

 @@IDENTITY、SCOPE_IDENTITY和IDENT_CURRENT是相似的函数,因为他们都是返回插入到表的IDENTITY列的最后一个值。

 @@IDENTITY、SCOPE_IDENTITY可以返回当前回话中的所有表中生成的最后一个标识值。但是 SCOPE_IDENTITY只在当前作用域内返回值,而  @@IDENTITY不限于特定的作用域。

 IDENT_CURRENT不受作用域和回话的限制,而受限于指定的表,IDENT_CURRENT可以返回任何回话和任何作用域中为特定表生成的标识值。

@@IDENTITY函数的作用域是执行该函数的本地服务器上的当前回话。此函数不能应用于远程或链接服务器。若要获得其他服务器上的标识值,请在远程服务器或链接服务器上执行存储过程,并使(在远或链接服务器的环境中执行的)该存储过程收集标识值,并将其返回本地服务器上的发出调用的连接。

以下实例,向包含标识列的表中插入一行 并使用@@IDENTITY显示新行中使用的标识值

USE AdventureWorks;GO--Display the value of LocationID in the last row in the table.SELECT MAX(LocationID) FROM Production.Location;GOINSERT INTO Production.Location (Name, CostRate, Availability, ModifiedDate)VALUES ('Damaged Goods', 5, 2.5, GETDATE());GOSELECT @@IDENTITY AS 'Identity';GO--Display the value of LocationID of the newly inserted row.SELECT MAX(LocationID) FROM Production.Location;GO
建议慎用@@IDENTITY而尽量采用SCOPE_IDENTITY()函数替换,SCOPE_IDENTITY()得到的也是最后一条自增的标识值,但是它仅限在一耳光操作范围内

而不是像@@IDENTITY是全局操作的最后一步操作所产生的自增域的值


转自:http://www.cnblogs.com/lovemyth/archive/2007/03/14/674584.html

原创粉丝点击