@@IDENTITY与SCOPE_IDENTITY()

  在一条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;
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
建议慎用@@IDENTITY而尽量采用SCOPE_ IDENTITY()函数替换, SCOPE_IDENTITY()得到的也是最后一条自增的标识值,但是它仅限在一耳光操作范围内

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


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值