solorez~Z Space

关注数据库,关注MS SQL Server

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

在SQL Server 中如何得到刚刚插入的标识值

数据库实际应用中,我们往往需要得到刚刚插入的标志值来往相关表中写入数据。但我们平常得到的真的是我们需要的那个值么?

有时我们会使用

SELECT @@Identity

来获得我们刚刚插入的值,比如下面的代码

复制代码
代码一:
use
 tempdb
if  exists (select * from sys.objects where object_id = object_id(N'[test1]'and type in (N'u'))
drop table [test1]
go
create table test1
(
    id            
int identity(1,1),
    content        
nvarchar(100)
)
insert into test1 (content)
values ('solorez')
select @@identity
复制代码

乐观情况下,这样做是没问题的,但如果我们如果先运行下面的代码二创建一个触发器、再运行代码三:

复制代码
代码二:
create
 table test2
(
    id            
int identity(100,1),
    content        
nvarchar(100)
)

create trigger tri_test1_identitytest_I
on test1 after insert
as
begin
    
insert into test2 
    
select content from inserted
end 
复制代码

代码三:
insert
 into test1 (content)
values ('solorez2')
select @@identity

我们可以看到,此时得到的标识值已经是100多了,很明显,这是表test2的生成的标识值,已经不是我们想要的了。

我们可以看看@@identity的定义:Identity

原来,@@identity返回的是当前事务最后插入的标识值。

这时我们或许会用下面的方法:

代码四:
insert
 into test1 (content)
values ('solorez3')
SELECT   IDENT_CURRENT('test1')

看来结果还比较正确,但如果我们在多次运行代码四的同时运行下面的代码五:

代码五:
insert
 into test1 (content)
values ('solorez3')

waitfor delay '00:00:20'
SELECT   IDENT_CURRENT('test1'

结果又不是我们想要的了!

再看看IDENT_CURRENT(Tablename) 的定义:IDENT_CURRENT(Tablename)

是返回指定表的最后标识值。

到这里,是该亮出答案的时候了,我们可以使用下面的代码:

代码六:
insert
 into test1 (content)
values ('solorez3')

SELECT   scope_identity() 

这时,我们无论是添加触发器还是运行并行插入,得到的始终是当前事务的标识值。

scope_identity()的定义:scope_identity()

 

PS:这是在添加触发器时,一个存储过程报错发现的问题,感觉有一定的普遍性,希望能给大家带来帮助。

相关参考资料:

http://msdn.microsoft.com/zh-cn/library/ms187342.aspx

http://msdn.microsoft.com/en-us/library/ms175098.aspx

Inside Sql Server 2005 - Storge Engine

http://www.cnblogs.com/suchenge/articles/848844.html

posted on   付博  阅读(3550)  评论(23编辑  收藏  举报

编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
点击右上角即可分享
微信分享提示