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

2016-02-19 18:18 8 1 收藏

有一种朋友不在生活里,却在生命力;有一种陪伴不在身边,却在心间。图老师即在大家的生活中又在身边。这么贴心的服务你感受到了吗?话不多说下面就和大家分享在SQL Server 中如何得到刚刚插入的标识值吧。

【 tulaoshi.com - 编程语言 】

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

  有时我们会使用

  SELECT @@Identity

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

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  代码一:

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')

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

  代码五:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

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.tulaoshi.com/n/20160219/1617214.html

延伸阅读
先把要恢复的文件置于MS SQL里的DATA文件里,进入MS SQL主数据库服务器。 1.我们使用默认方式建立一个供恢复使用的数据库(如MHDYF2005)。可以在SQL Server里面建立。 2.停掉数据库服务器。 3.将刚才生成的数据库的日志文件MHDYF2005_log.ldf删除,用要恢复的数据库mdf(yu1.mdf)文件覆盖刚才生成的数据库数据文...
数据库操作的死锁是不可避免的,本文并不打算讨论死锁如何产生,重点在于解决死锁,通过SQL Server 2005, 现在似乎有了一种新的解决办法。 将下面的SQL语句放在两个不同的连接里面,并且在5秒内同时执行,将会发生死锁。 use Northwind begin tran insert into Orders(CustomerId) values(@#ALFKI@#) waitfor delay @#00:00:...
标签: SQLServer
建一表,放初始化资料  因为农历的日期,是由天文学家推算出来的,到现在只有到2049年的,以后的有了还可以加入!  CREATE  TABLE  SolarData  (         yearId  int  not  null,         data  char(7)  no...
在SQL Server Oracle MySQL当数据库中查出某值为NULL怎么办? 1、MSSQL: ISNULL() 语法 ISNULL ( check_expression , replacement_value ) 参数 check_expression 将被检查是否为 NULL的表达式。check_expression 可以是任何类型的。 replacement_value 在 check_expression 为 NULL时将...
标签: Web开发
通过ADO可以访问SQL SERVER,并执行相应的SQL语句建库、建表,下面是SQL SERVER BOOKS ONLINE中的相关定义。     建表:   CREATE TABLE   [       database_name.[owner].       | owner. &n...

经验教程

997

收藏

8
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部