Sqlserver @@IDENTITY 和 SCOPE_IDENTITY() 的使用

为啥单独写这个呢. 有个系统用了7年 好好的 没点问题.今天早上正在愉快搬砖中. 突然 邮件满天飞.说提交数据出问题了. 一看错误.主键重复. 我主键是自增的怎么重复呢 , 背景是主表为A表/从表为B 表 在A表产生一个自增值 然后作为主键插入到B表. 我直接 在数据库测试插入个人习惯 用 SCOPE_IDENTITY()  没有问题 ,  最后检查代码发现.获取A表自增的时候 使用的是  @@IDENTITY, 随后改掉正常了

问题产生的原因就要从 这两个获取当前 会话的自增的规则来讲了

  SCOPE_IDENTITY()  只返回插入到当前作用域中的值

  @@IDENTITY   返回在当前会话中的任何表内所生成的最后一个标识值

 

而在我刚刚的问题中. 产生的原因就是同事在 A表中加了个触发器在A插入数据时同时在另一个有自增的表插入一条数据, 按上面的规则 @@IDENTITY    返回当前会话的 不管是哪个地方的. 所以它返回了触发器里插入另一个表时产生的自增值, 而 SCOPE_IDENTITY 对于当前的作用域来说 触发器里的事情已经超出它的域了所以是不管的.就能正确返回.

因为 日常返回自增时按使用情况 决定用哪一个 不要盲目的使用  @@IDENTITY 

posted @ 2021-03-30 11:59  望着天的蜗牛  阅读(804)  评论(1编辑  收藏  举报