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('表名')

最新文章

  1. 十、DG
  2. AngularJs 简单实现全选,多选操作
  3. MySQL 事件跟踪器 , MySQL 无须重启服务 跟踪 SQL , 也无须配置日志
  4. GZFramwork快速开发框架演练之会员系统(一)框架源码下载
  5. startUML常用的组合片段
  6. Window.onLoad 和 DOMContentLoaded事件的先后顺序
  7. debian防火墙firestarter
  8. 访问WEB-INF目录中的JSP文件
  9. 关于修改tabbar的颜色的问题
  10. MySQL生产库主从重新同步操作注意事项
  11. C# 引用SHDocVw 实现模拟网页操作
  12. [Swust OJ 566]--开N方数(牛顿切线法解高次方程)
  13. python函数的面向对象——面向对象设计
  14. VMware-vCenter-Server-Appliance VCSA升级步骤
  15. re模块正则表达式
  16. Retrofit 下载网络图片 保存到本地
  17. WPF 初识
  18. jquery datatables+MVC+WCF
  19. CentOS7 安装oracle客户端
  20. 【文件】使用jacob将word转换成pdf格式

热门文章

  1. Linux之more命令
  2. KNN分类算法
  3. MyBatis笔记-03-CRUD
  4. C语言1-2019秋第一周作业
  5. union不支持orderByClause、clusterByClause、distributeByClause、sortByClause或limitClause
  6. sql 查询列
  7. maven报错1
  8. Linux下SHA256校验
  9. 24.Python比较运算符(关系运算符
  10. vue 打包部署到服务器上 配置nginx访问