现在的位置: 首页 > 综合 > 正文

@@IDENTITY,SCOPE_IDENTITY和IDENT_CURRENT【通俗易懂】

2014年01月02日 ⁄ 综合 ⁄ 共 1034字 ⁄ 字号 评论关闭
  1. SQLServer中@@IDENTITY,SCOPE_IDENTITY和IDENT_CURRENT的作用
  2. 相同点:
  3. 它们都返回插入到IDENTITY列中的值。
  4. 不同点:
  5.   A.  @@IDENTITY不受作用域(存储过程、触发器、函数或批处理)的限制。返回最后一个插入的IDENTITY值。如果在程序中不同的作用域插入的表不同,那么返回最后一个表插入的IDENTITY值。例如:作用域A(存储过程)在表T1上插入IDENTITY列,而T1上的触发器会在T2上插入IDENTITY列。则用@@IDENTITY返回T2上插入的IDENTITY值。举例:
  6. 下面的示例向带有标识列的表中插入一行,并用@@IDENTITY 显示在新行中使用的标识值。
  7.  程序代码
  8. Insert   INTO   jobs   (job_desc,min_lvl,max_lvl)   
  9.   VALUES   ('Accountant',12,125)   
  10.   Select   @@IDENTITY   AS   'Identity' 
  11.   B. SCOPE_IDENTITY()受作用域的限制,只返回当前作用域中的最后一个IDENTITY值。上例中,如果在存储过程中使用SCOPE_IDENTITY(),则返回T1的IDENTITY值。
  12.   C. IDENT_CURRENT()不受作用域的限制,调用它时必须提供表示表名的字符型参数,你可以得到你想要的任何表的最后一个IDENTITY值,即使你的代码里没有插入动作。例如:IDENT_CURRENT('T1');
  13. 经验:
  14.   根据不同的使用场合,选择不同的函数。如果在写存储过程时,向表中新增了一条数据,需要返回该IDENTITY值,则使用SCOPE_IDENTITY(),因为它和当前会话相关联,不会返回一个你不需要的值。如果你仅仅想得到某个IDENTITY列的最后一个值,则使用IDENT_CURRENT()最方便。
  15. -----------------------------以上部分来自于网络收集

A 用@@IDENTITY时 不受作用域控制,当插入T1表后 同事触发了T1表触发器插入ID  这时@@IDENTITY返回的ID是 T1表中触发器 添加的NewID

B 在A中情况如果使用 SCOPE_IDENTITY()时则会返回第一次插入T1表中的ID【SCOPE_IDENTITY()受作用域控制】

C 这样的使用例如:IDENT_CURRENT('T1'); 也没什么好说得啦。

抱歉!评论已关闭.