码迷,mamicode.com
首页 > 其他好文 > 详细

@@ROWCOUNT,@@IDENTITY, SCOPE_IDENTITY()

时间:2017-06-10 23:30:11      阅读:268      评论:0      收藏:0      [点我收藏+]

标签:update   bsp   标识   color   count   输出   作用   建议   数据表   

@@ROWCOUNT

返回受上一语句影响的行数,常用在 Update,Insert,Delete。如果行数大于 20 亿,请使用 ROWCOUNT_BIG。

@@IDENTITY  返回最后插入的标识值的系统函数.可以用在插入数据后把标识值返回(不是最好的选择)

 @@identity使用注意事项


  我们要慎用@@IDENTITY,原因是 @@IDENTITY 它总是获取最后一条变更数据的自增字段的值,
而忽略了进行变更操作所在的范围约束。比如,我有表 A 和表 B 两个表,现在我在表 A 上定义了一个Insert触发器,当在表 A 中插入一条数据时,自动在表 B 也插入一条数据。此时,大家注意,有两个原子操作:在A中插入一条数据, 接着在B中随后插入一条数据。

  现在我们想下,假设上面表 A 和表 B 都有IDENTITY自增域,那么我们在表 A 插入一条数据后,使用了 SELECT @@IDENTITY 输出时,输出的到底是 A 还是 B 的自增域的值呢? 答案很明显,是谁最后插入就输出谁,那么就是 B 了。于是,我本意是想得到 A 的自增域值,结果得到了 B 的自增域值,一只 BUG 随之诞生,搞不好还会影响到整个系统数据的混乱。

  因此,对于这种情况,建议大家慎用 @@IDENTITY,而尽量采用 SCOPE_IDENTITY() 函数替换之。SCOPE_IDENTITY() 也是得到最后一条自增域的值,但是它是仅限在一个操作范围之内,而不@@IDENTITY 是取全局操作的最后一步操作所产生的自增域的值的。

 

select SCOPE_IDENTITY() 

返回上面操作的数据表最后row的IDENTITY 列的值; 

返回插入到同一作用域中的 IDENTITY 列内的最后一个 IDENTITY 值。一个作用域就是一个模块——存储过程、触发器、函数或批处理。因此,如果两个语句处于同一个存储过程、函数或批处理中,则它们位于相同的作用域中。

 

@@ROWCOUNT,@@IDENTITY, SCOPE_IDENTITY()

标签:update   bsp   标识   color   count   输出   作用   建议   数据表   

原文地址:http://www.cnblogs.com/Cein/p/6980134.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!