在SQL数据库中如何得到刚刚插入的标识值_SQL SERVER数据库_黑客防线网安服务器维护基地--Powered by WWW.RONGSEN.COM.CN

在SQL数据库 中如何得到刚刚插入的标识值

作者:黑客防线网安SQL维护基地 来源:黑客防线网安SQL维护基地 浏览次数:0

本篇关键词:插入标识刚刚得到
黑客防线网安网讯:  数据库实际应用中,我们往往需要得到刚刚插入的标志值来往相关表中写入数据。但我们平常得到的真的是我们需要的那个值么?  有时我们会使用  SELECT @@Identity   来获得我们刚刚...

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

  有时我们会使用

  SELECT @@Identity

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

  代码一:

usetempdb
if exists(select*fromsys.objectswhereobject_id=object_id(N'[test1]')andtypein(N'u'))
droptable[test1]
go
createtabletest1
(
  id      intidentity(1,1),
  content    nvarchar(100)
)
insertintotest1(content)
values('solorez')
select@@identity

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

  代码二:
createtabletest2
(
  id      intidentity(100,1),
  content    nvarchar(100)
)
createtriggertri_test1_identitytest_I
ontest1afterinsert
as
begin
  insertintotest2
  selectcontentfrominserted
end

  代码三:

insertintotest1(content)
values('solorez2')
select@@identity

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

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

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

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

  代码四:

insertintotest1(content)
values('solorez3')
SELECT IDENT_CURRENT('test1')

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

  代码五:

insertintotest1(content)
values('solorez3')
waitfordelay'00:00:20'
SELECT IDENT_CURRENT('test1')

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

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

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

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

  代码六:

insertintotest1(content)
values('solorez3')
SELECT scope_identity()

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

  scope_identity()的定义:scope_identity()

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

    黑客防线网安服务器维护方案本篇连接:http://www.rongsen.com.cn/show-9697-1.html
网站维护教程更新时间:2012-03-21 02:24:03  【打印此页】  【关闭
我要申请本站N点 | 黑客防线官网 |  
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479

footer  footer  footer  footer