预备知识:SQL Server的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 不受限于特定的作用域。
 
 
SQL Server中@@IDENTITY,SCOPE_IDENTITY和IDENT_CURRENT的作用
 
相同点:
它们都返回插入到IDENTITY列中的值。
不同点:
  A. @@IDENTITY不受作用域(存储过程、触发器、函数或批处理)的限制。返回最后一个插入的IDENTITY值。如果在程序中不同的作用域插入的表不同,那么返回最后一个表插入的IDENTITY值。例如:作用域A(存储过程)在表T1上插入IDENTITY列,而T1上的触发器会在表T2上插入IDENTITY列。则用@@IDENTITY返回T2上插入的IDENTITY值。举例:
下面的示例向带有标识列的表中插入一行,并用@@IDENTITY 显示在新行中使用的标识值。
程序代码
Insert INTO T1(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()最方便。
 
 
 

Sql Server插入数据并返回自增ID,@@IDENTITY,SCOPE_IDENTITY和IDENT_CURRENT的区别(转载)的更多相关文章

  1. Sql Server插入数据并返回自增ID,@@IDENTITY,SCOPE_IDENTITY和IDENT_CURRENT的区别

    预备知识:SQLServer的IDENTITY关键字IDENTITY关键字代表的是一个函数,而不是identity属性.在access里边没有这个函数,所以在access不能用这个语句.语法:iden ...

  2. 基础-ADO插入数据后返回自增ID @@IDENTITY

    在文件上传中,没上传一个文件都会插入一条数据信息,那么就要返回插入的数据的id,以便进行真实删除操作.以下是ADO操作数据库的返回方法: string sql = string.Format(@&qu ...

  3. mysql插入数据后返回自增ID的方法,last_insert_id(),selectkey

    mysql插入数据后返回自增ID的方法 mysql和oracle插入的时候有一个很大的区别是,oracle支持序列做id,mysql本身有一个列可以做自增长字段,mysql在插入一条数据后,如何能获得 ...

  4. mysql函数之六:mysql插入数据后返回自增ID的方法,last_insert_id(),selectkey

    mysql插入数据后返回自增ID的方法 mysql和oracle插入的时候有一个很大的区别是,oracle支持序列做id,mysql本身有一个列可以做自增长字段,mysql在插入一条数据后,如何能获得 ...

  5. SQL Server 插入数据后获得自增主键值

    通过SQLServer系统自带函数获取 String sql = "insert into goods values('" + TextBox1.Text + "',&q ...

  6. mysql插入数据后返回自增ID的方法

    mysql和oracle插入的时候有一个很大的区别是,oracle支持序列做id,mysql本身有一个列可以做自增长字段,mysql在插入一条数据后,如何能获得到这个自增id的值呢? 方法一是使用la ...

  7. mybatis插入数据并返回自增Id

    上图mybatis的写法,在xxxMapper.xml中: 加入:useGeneratedKeys="true" keyProperty="applyId" k ...

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

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

  9. mysql 插入数据后返回自增 ID 的七种方法

    参考地址:https://blog.csdn.net/qq_30715329/article/details/80868411 其中使用函数方式.存储过程方式.注解方式.xml属性方式设置都可. 常用 ...

随机推荐

  1. JavaScript长时间未操作自动退出登录

    主要是通过mouseover 来监听有没有进行当前页面操作,通过未操作时间和设定退出的时间做比较,从而退出登录. var oldTime = new Date().getTime(); var new ...

  2. 2018下半年Android面试历程

    个人看法:可以总结下他的面试经历以及涉及到的面试题 下面开始正文吧: 从今年下半年以来就开始在杭州准备简历找工作了,原因基本都懂的,没多少工资,投递简历的渠道是Boss,偶尔也在拉钩上投递,刚开始把简 ...

  3. (网页)JS去掉字符串前后空格或去掉所有空格的用法(转)

    转自脚本之家: 这篇文章主要介绍了JS去掉字符串前后空格或去掉所有空格的用法,需要的朋友可以参考下: 代码如下: function Trim(str) { return str.replace(/(^ ...

  4. 我的简历 PHP Java C# 技术总监

          石先生 ID:303321266 目前正在找工作 13611326258 hr_msn@163.com 男|32 岁 (1985/08/06)|现居住北京-海淀区|12年工作经验     ...

  5. 【第四篇】SAP ABAP7.5x新语法之CREATE DATA&INTERFACE

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文地址:SAP ABAP7.5x系列之CREATE DA ...

  6. Excel两列查找重复值

    判断A列的值在B列是否存在,如果存在则输出“yes” 在C1单元格使用如下公式: =IF(COUNTIF(A:A,B2)>0,"yes","")

  7. windows 实用技巧

    以下内容版权归原作者所有!!!如果侵权,立即删除. 1.系统激活:https://mp.weixin.qq.com/s/Kl_iEeSSxSprblfSRZ6yEQ 2.百度云下载:https://w ...

  8. myeclipse编写servlet

    1.File--New--Other.搜索web--Dynamic Web Project--Next,Project name--Next,Next--web应用的根目录和web资源存放的目录--- ...

  9. git撤销本地提交但未push的记录

    ### git撤销本地提交但未push的记录 前言:有时候本地执行commit命令或者cherry-pick命令后发现提交了不需要提交的东西,就需要把已提交的commit记录撤销下来,简单做下记录 撤 ...

  10. SQL 三范式

    第一范式:无重复的列,一列只能包含一个字段 第二范式:主键约束,一行只能被唯一标识 第三范式:非主键字段要严格依赖于主键字段