博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

IDENTITY,SCOPE_IDENTITY和IDENT_CURRENT的辨析

Posted on 2010-08-26 13:56  moss_tan_jun  阅读(655)  评论(1编辑  收藏  举报

预备知识:SQLServer的IDENTITY关键字
IDENTITY关键字代表的是一个函数,而不是identity属性。在access里边没有这个函数,所以在access不能用这个语句。语法:identity (数据类型,标识种子,标识增长量)
举例:select identity (数据类型,标识种子,标识增长量) AS 列名 into 新表 from 原表名

每个表都可以有一个自动增长列,众所周知的就是IDENTITY列。一个IDENTITY列总是被当作表的主键处理(因此,多列主键不可能有一个IDENTITY列)。并且从中可看出,我们很容易指定从什么数开始,增幅是多少。

 

SQLServer中@@IDENTITY,SCOPE_IDENTITY和IDENT_CURRENT的作用
相同点:

它们都返回插入到IDENTITY列中的值。

不同点:

  A.  @@IDENTITY不受作用域(存储过程、触发器、函数或批处理)的限制。返回最后一个插入的IDENTITY值。如果在程序中不同的作用域插入的表不同,那么返回最后一个表插入的IDENTITY值。例如:作用域A(存储过程)在表T1上插入IDENTITY列,而T1上的触发器会在T2上插入IDENTITY列。则用@@IDENTITY返回T2上插入的IDENTITY值。举例:
下面的示例向带有标识列的表中插入一行,并用@@IDENTITY 显示在新行中使用的标识值。

程序代码
Insert   INTO   jobs   (job_desc,min_lvl,max_lvl)  
  VALUES   ('Accountant',12,125)  
  Select   @@IDENTITY   AS   'Identity'



  B. SCOPE_IDENTITY()受作用域的限制,只返回当前作用域中的最后一个IDENTITY值。上例中,如果在存储过程中使用SCOPE_IDENTITY(),则返回T1的IDENTITY值。

  C. IDENT_CURRENT()不受作用域的限制,调用它时必须提供表示表名的字符型参数,你可以得到你想要的任何表的最后一个IDENTITY值,即使你的代码里没有插入动作。例如:IDENT_CURRENT('T1');

经验:
  根据不同的使用场合,选择不同的函数。如果在写存储过程时,向表中新增了一条数据,需要返回该IDENTITY值,则使用 SCOPE_IDENTITY(),因为它和当前会话相关联,不会返回一个你不需要的值。如果你仅仅想得到某个IDENTITY列的最后一个值,则使用 IDENT_CURRENT()最方便