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

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

SQL SERVER 2000中,有三个比较类似的功能:他们分别是:SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY,它们都返回插入到 IDENTITY 列中的值。

IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值。IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表。IDENT_CURRENT 返回为任何会话和作用域中的特定表所生成的值。
@@IDENTITY 返回为当前会话的所有作用域中的任何表最后生成的标识值。
SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值

SCOPE_IDENTITY 和 @@IDENTITY 返回在当前会话中的任何表内所生成的最后一个标识值。但是,SCOPE_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');

经验:

比如,表 A 中有个 ID 为自增1的字段,假设此时 ID 的值为100,现在如果我往表A插入一条数据,并在插入后 SELECT @@IDENTITY,则其返回 101,最后一条IDENTITY域(即ID域)的值。

现在问题来了,为什么说要慎用@@IDENTITY呢?原因是 @@IDENTITY 它总是获取最后一条变更数据的自增字段的值,而忽略了进行变更操作所在的范围约束。

比如,我有表 A 和表 B 两个表,现在我在表 A 上定义了一个Insert触发器,当在表 A 中插入一条数据时,自动在表 B 也插入一条数据。此时,大家注意,有两个原子操作:在A中插入一条数据, 接着在B中随后插入一条数据。

现在我们想下,假设上面表 A 和表 B 都有IDENTITY自增域,那么我们在表 A 插入一条数据后,使用了
SELECT @@IDENTITY 输出时,输出的到底是 A 还是 B 的自增域的值呢? 答案很明显,是谁最后插入就输出谁,那么就是 B 了。于是,我本意是想得到 A 的自增域值,结果得到了 B 的自增域值,一只 BUG 随之诞生,搞不好还会影响到整个系统数据的混乱。

因此,对于这种情况,建议大家慎用 @@IDENTITY,而尽量采用 SCOPE_IDENTITY() 函数,替换用SCOPE_IDENTITY() 也是得到最后一条自增域的值,但是它是仅限在一个操作范围之内,而不像 @@IDENTITY 是取全局操作的最后一步操作所产生的自增域的值的。

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

转载于:https://www.cnblogs.com/yonsy/p/5466195.html

Sql Server插入数据并返回自增ID,@@IDENTITY,SCOPE_IDENTITY和IDENT_CURRENT的区别相关推荐

  1. mysql c接口返回自增id_详解mysql插入数据后返回自增ID的七种方法

    引言 mysql 和 oracle 插入的时候有一个很大的区别是: oracle 支持序列做 id: mysql 本身有一个列可以做自增长字段. mysql 在插入一条数据后,如何能获得到这个自增 i ...

  2. mysql 新增返回主键自增id_详解mysql插入数据后返回自增ID的七种方法

    引言 mysql 和 oracle 插入的时候有一个很大的区别是: oracle 支持序列做 id: mysql 本身有一个列可以做自增长字段. mysql 在插入一条数据后,如何能获得到这个自增 i ...

  3. mysql插入数据后返回自增id

    mysql插入数据后返回自增id 使用<insert 中的useGeneratedKeys 和 keyProperty 两个属性 在Mybatis Mapper文件中添加属性 useGenera ...

  4. mysql generatedkey_Mybatis使用generatedKey在插入数据时返回自增id始终为1,自增id实际返回到原对象当中的问题排查...

    今天在使用数据库的时候,遇到一个场景,即在插入数据完成后需要返回此数据对应的自增主键id,但是在使用Mybatis中的generatedKey且确认各项配置均正确无误的情况下,每次插入成功后,返回的都 ...

  5. mybatis 插入数据后返回自增id

    useGeneratedKeys="true" keyProperty="id"> sql全部内容: <insert id="insert ...

  6. 七种MYSQL插入数据后返回自增主键ID的方法

    我们都知道,mysql中的insert插入之后会有返回值,返回的是影响的行数,也就是说,成功插入一条数据之后返回的是1,失败则返回0.那么,很多时候我们都想要得到最后插入的id值,下面七种方法均可,结 ...

  7. SQL 2008 使用insert into 语句时自增ID插入数据时实现自增ID

    SQL 2008 使用insert into 语句时自增ID插入数据时实现自增ID 建立一张User表 使用insert into 语句插入一行新的数据 结果如下

  8. mybatis插入数据后返回自增主键ID详解

    1.场景介绍: ​ 开发过程中我们经常性的会用到许多的中间表,用于数据之间的对应和关联.这个时候我们关联最多的就是ID,我们在一张表中插入数据后级联增加到关联表中.我们熟知的mybatis在插入数据后 ...

  9. Mybatis 插入数据后返回自增主键ID

    1 xml 映射文件中处理 在映射器中配置获取记录主键值 在xml中 insert 标签中定义 : useGeneratedKeys为true,用来设置返回主键id的值, keyProperty 代表 ...

最新文章

  1. 安全攻防技能——Web安全——XSS
  2. 英语写作学习笔录 task1 body
  3. scrollview 实现滑动到底部再滑动加载数据的功能
  4. [转]Oracle update用例
  5. 清华裴丹:AIOps 落地路线图
  6. python伪代码书写规范_代码这样写更优雅(Python 版)(转载)
  7. 190910-ajax-请求小结
  8. QT5开发及实例学习之十二Qt5图像坐标变换
  9. 九度OJ 1048:判断三角形类型
  10. java JVM常见的四大异常及处理方案
  11. 微信小游戏代码包侵权的避开技巧(含处理脚本代码)
  12. cr2格式缩略图不显示_cr2缩略图补丁 佳能相机RAW文件CR2原片格式缩略图显示补丁- 游侠下载站...
  13. Linux中awk命令正确的求最大值、最小值、平均值、总和
  14. EXCEL之绝对引用、相对引用和混合引用
  15. acml会议级别_人工智能领域的顶级学术会议大全(二)
  16. word转换成字符串
  17. 电脑位置,Windows10系统查找电脑设备位置的方法介绍
  18. 微星GL62M 7RDX笔记本矫正屏幕色彩
  19. mysql 1093 you can_mysql中错误:1093-You can’t specify target table for update in FROM clause的解决方法...
  20. 线性代数(7):矩阵的应用

热门文章

  1. makefile .phony targets
  2. vlc学习计划(4)--在EMACS中使用GDB调试
  3. 从Varchar转换为 datetime
  4. CSLA.Net 3.0.5 项目管理示例 名值列表基类、只读基类、业务负责人基类
  5. 【Amazon 必考】Amazon Leadership Principles 亚马逊领导力准则
  6. 【JavaScript框架封装】公共框架的封装
  7. chrome浏览器的跨域设置 Google Chrome浏览器下开启禁用缓存和js跨域限制--disable-web-security...
  8. 深入浅出OOP(四): 多态和继承(抽象类)
  9. 修改MySql默认存储引擎为InnoDB,启动报错
  10. dedecms首页搜索 添加仿百度下拉框