zoukankan      html  css  js  c++  java
  • 获取sql server中自增量之scope_identity(),@@Identity,IDENT_CURRENT的区别

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

    在sql server2005,如果要获某个表最新增加的自增量,我们都知道,可以使用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
    select SCOPE_IDENTITY()
    select IDENT_CURRENT('T1')
    select IDENT_CURRENT('T2')



    返回值应为:
    2000
    1000
    1000
    2000

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

    insert into 表(列) values(值);
    select @@IDENTITY


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

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


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

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

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

  • 相关阅读:
    推荐电影 迪士尼经典动画片大全 1937-2008
    推荐电影 奥黛丽赫本的十大经典电影 1953-1989
    生活娱乐 ATM机键盘余温泄露密码
    生活娱乐 Wifi机器人的制作流程
    生活娱乐 WIFI机器人(某机器发烧友自己动手做一台)
    电脑技巧 ADSL如何远程盗号
    生活娱乐 VERYCD的T恤设计大赛
    系统重装 如何在固态硬盘上重装系统
    Visual Studio VS如何统计代码行数
    解决启动nginx时报80端口被占用的问题
  • 原文地址:https://www.cnblogs.com/Tom-yi/p/8630012.html
Copyright © 2011-2022 走看看