SQL SERVER 使用触发器的情况下@@IDENTITY不准确的问题

       @@IDENTITY是返回最后插入的标识值的系统函数。在一条 INSERT、SELECT INTO 或大容量复制语句完成后,@@IDENTITY 中包含语句生成的最后一个标识值。 如果语句未影响任何包含标识列的表,则 @@IDENTITY 返回 NULL。 如果插入了多个行,生成了多个标识值,则 @@IDENTITY 将返回最后生成的标识值。

       我们常用@@IDENTITY来获取插入的标识列值,一般情况下这个是准确的,但是由于@@IDENTITY 返回为当前会话的所有作用域中的任何表最后生成的标识值。,如果在插入数据之后还有别的插入操作,并且也有标识列,就可能产生错误,例如使用触发器。

       测试表:

--T主表,先插入两条数据
if not object_id(N'T') is null
	drop table T
Go
Create table T([Id] INT PRIMARY KEY IDENTITY,[Name] nvarchar(22))
Insert T
select N'张三' union all
select N'李四'
Go
--触发器记录表
if not object_id(N'T1') is null
	drop table T1
Go
Create table T1([Id] INT PRIMARY KEY IDENTITY,Tid INT)

       在T表上建立触发器:

CREATE TRIGGER dbo.T_TRI
on [dbo].[T]
for insert
 as
 INSERT INTO dbo.T1(Tid)
 SELECT Id FROM Inserted
GO

       给T表插入数据,并返回@@IDENTITY值,这时候由于T表中已经有两条数据,所以@@IDENTITY应该返回3:

Insert T
select N'王五' 

SELECT @@IDENTITY

       结果:

       这时候我们看到返回的却是1,这个值其实是触发器插入数据T1表的标识自增列的值,这样的话我们得到的1就是错误的值了,如果想得到正确的值,可以使用SCOPE_IDENTITY ,SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值。

       我们来试一下:

Insert T
select N'赵六' 

SELECT SCOPE_IDENTITY()

       结果:

扫描二维码关注公众号,回复: 4526878 查看本文章

      我们看到这个4才是我们想要的正确的值,所以在有触发器的情况下慎用@@IDENTITY,应该尝试使用SCOPE_IDENTITY。

猜你喜欢

转载自blog.csdn.net/sinat_28984567/article/details/85028854