获取sql server中自增量之scope_identity,@@Identity,IDENT_CURRENT的区别


http://www.lmwlove.com/ac/ID480

在sqlserver2005,如果要获某个表最新增加的自增量,我们都知道,可以使用COPE_IDENTITY、

IDENT_CURRENT和@@IDENTITY三个函数,因为它们都返回插入到标识列中的值。但这三个函数是不是不管什么时候,返回的值都一样的呢?答案是错的,本人以前正是因为没有理解到这三个函数的区别,所以取到了错误的自增量。

首先我们来看一下三个函数的定义:
@@IDENTITY:返回为跨所有作用域的当前会话中的某个表生成的最新标识值。
SCOPE_IDENTITY:返回为当前会话和当前作用域中的某个表生成的最新标识值。
IDENT_CURRENT:返回为某个会话和用域中的指定表生成的最新标识值。

在详解之前,我们先了解什么是会话与作用域:
sql会话:用户利用sql命令或使用查询分析器连接到数据库时,一个新的会话就建立了,一直到该连接断开,或者用户重置该连接为止,都处于同一个会话中。
作用域:如果多个语句处在同一个存储过程,函数,批处理中,那么它们位于相同的作用域中。

了解会话与作用域后,相信读者对以上三个函数都有了大概的理解了。我们再举个例子来说明。
假设有表T1与T2,T1与T2表都包含自增列ID。我们在T1表中使用insert触发器往T2中添加数据。
现在我们往T1表添加新数据,假设T1表新的ID值为1000,T1表的触发器往T2表添加数据T2表产生的新ID值
为2000,

那么执行完插入语句后马上执行

select@@IDENTITY
selectSCOPE_IDENTITY()
selectIDENT_CURRENT('T1')
selectIDENT_CURRENT('T2')



返回值应为:
2000
1000
1000
2000

延伸提醒:我们在写插入语句时总喜欢返回最新的ID值,Sql一般是这样写的

insertinto表(列)values(值);
select@@IDENTITY


比如动软自动生成的代码就是如此,

其实@@IDENTITY是不保险的,SCOPE_IDENTITY()才是最保险的


附上另两个与自量列有关的函数:

1、获取标识列的种子值
可使用函数IDENT_SEED,用法:
SELECTIDENT_SEED('表名')

2、获取标识列的递增量
可使用函数IDENT_INCR,用法:
SELECTIDENT_INCR('表名')

优质内容筛选与推荐>>
1、自定义windows新建菜单
2、20145239 实验一 Java开发环境的熟悉(Windows + IDEA)
3、BZOJ1101: [POI2007]Zap(莫比乌斯反演)
4、3. HTML音频
5、javascript的typeof使用


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn