获取表的标识值,有3种比较常见的用法 IDENT_CURRENT ,@@identity,SCOPE_IDENTITY(),有啥不一样呢?
3个关键字在联机手册中的解释
 
  • IDENT_CURRENT 返回为某个会话和用域中的指定表生成的最新标识值。
  • @@IDENTITY 返回为跨所有作用域的当前会话中的某个表生成的最新标识值。
  • SCOPE_IDENTITY() 返回为当前会话和当前作用域中的某个表生成的最新标识值。
 
也就是说,同一作用域下,插入了数据,不考虑并发的情况下,@@IDENTITY ,SCOPE_IDENTITY(),IDENT_CURRENT 的值是没有差别的。
IDENT_CURRENT 是看表对象。所以没有受作用域限制。
SCOPE_IDENTITY()  受作用域限制。同一个会话里面不同作用域也会有差异
@@IDENTITY  受会话限制。不同会话里面值不一样
 

 
好,开波做测试。
测试不同点,建立测试表
 
 
CREATE TABLE TestTB1
(ID INT IDENTITY(1,1) PRIMARY KEY,
DATA VARCHAR(50))

当会话没有插入数据的时候, @@IDENTITY  和  SCOPE_IDENTITY() 都是null,而  IDENT_CURRENT是1 这个是需要区别

SELECT @@identity AS '@@identity' ,
SCOPE_IDENTITY() AS 'SCOPE_IDENTITY()' ,
IDENT_CURRENT('TestTB1') AS 'IDENT_CURRENT()'

测试@@IDENTITY 和   IDENT_CURRENT('TestTB1') 的值变化是否与会话有关
会话1:
 INSERT INTO TestTB1 (Data) SELECT 'A'
SELECT '会话1',@@IDENTITY AS '@@IDENTITY',IDENT_CURRENT('TestTB1') AS 'IDENT_CURRENT()'

会话2:
INSERT INTO TestTB1 (Data) SELECT 'B'
SELECT '会话2',@@IDENTITY AS '@@IDENTITY',IDENT_CURRENT('TestTB1') AS 'IDENT_CURRENT()'
那再在会话1里面插入一条数据。这个时候,会话2里面的 @@IDENTITY 依然是2,证明 @@IDENTITY 是与会话有关的
会话1
INSERT INTO TestTB1 (Data) SELECT 'C'
SELECT '会话1',@@IDENTITY AS '@@IDENTITY',IDENT_CURRENT('TestTB1') AS 'IDENT_CURRENT()'

会话2

SELECT * FROM dbo.TestTB1
SELECT '会话2',@@IDENTITY AS '@@IDENTITY',,IDENT_CURRENT('TestTB1') AS 'IDENT_CURRENT()'

模拟一下不同作用域的情况,创建了一个临时存储过程 #TEST_PRO,
就能看到 同一会话不同作用域的 SCOPE_IDENTITY() 并不能获取到种子值
 
TRUNCATE TABLE dbo.TestTB1
go CREATE PROCEDURE #TEST_PRO
AS
BEGIN
INSERT INTO TestTB1 (Data) SELECT 'A'
SELECT @@identity AS '@@identity' ,
SCOPE_IDENTITY() AS 'SCOPE_IDENTITY()' ,
IDENT_CURRENT('TestTB1') AS 'IDENT_CURRENT()'
END
go EXEC #TEST_PRO SELECT @@identity AS '@@identity' ,
SCOPE_IDENTITY() AS 'SCOPE_IDENTITY()' ,
IDENT_CURRENT('TestTB1') AS 'IDENT_CURRENT()'

那嵌套的情况会怎样呢?再嵌套一层看看,实验结果是跟上面是一致的,在嵌套情况下,作用域不同, SCOPE_IDENTITY() 会重新计数,如下

TRUNCATE TABLE dbo.TestTB1
go CREATE PROCEDURE #TEST_PRO_Inner
AS
BEGIN
INSERT INTO TestTB1 (Data) SELECT 'A'
SELECT 'TEST_PRO_Inner',
@@identity AS '@@identity' ,
SCOPE_IDENTITY() AS 'SCOPE_IDENTITY()' ,
IDENT_CURRENT('TestTB1') AS 'IDENT_CURRENT()'
END
go CREATE PROCEDURE #TEST_PRO
AS
BEGIN
EXEC #TEST_PRO_Inner
SELECT 'TEST_PRO',
@@identity AS '@@identity' ,
SCOPE_IDENTITY() AS 'SCOPE_IDENTITY()' ,
IDENT_CURRENT('TestTB1') AS 'IDENT_CURRENT()'
INSERT INTO TestTB1 (Data) SELECT 'B'
SELECT 'TEST_PRO_1',
@@identity AS '@@identity' ,
SCOPE_IDENTITY() AS 'SCOPE_IDENTITY()' ,
IDENT_CURRENT('TestTB1') AS 'IDENT_CURRENT()'
END
go EXEC #TEST_PRO
SELECT '外部',
@@identity AS '@@identity' ,
SCOPE_IDENTITY() AS 'SCOPE_IDENTITY()' ,
IDENT_CURRENT('TestTB1') AS 'IDENT_CURRENT()'

PS:第一次写blog,写得不好,请各位看官多包涵。多指导

IDENT_CURRENT ,@@identity,SCOPE_IDENTITY() 之间对比的更多相关文章

  1. [转]IDENT_CURRENT、SCOPE_IDENTITY、@@IDENTITY 差異對照表

    本文转自:http://www.dotblogs.com.tw/hunterpo/archive/2009/09/04/10421.aspx IDENT_CURRENT.SCOPE_IDENTITY ...

  2. 糟糕的@@identity,SCOPE_IDENTITY ,IDENT_CURRENT

    在某数据库里面,某甲用@@identity来获取最近插入的id值,当在多人环境,发生获取到null值的问题. 那么@@identity是否有存在的必要? 感觉像生个孩子,多了个指头. 有的数据库的ge ...

  3. SQL SERVER-identity | @@identity | scope_identity

    主键自增 IDENTITY(1,1),MS SQL Server 使用 IDENTITY 关键字来执行 auto-increment 任务. 在上面的实例中,IDENTITY 的开始值是 1,每条新记 ...

  4. SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY

    SCOPE_IDENTITY.IDENT_CURRENT 和 @@IDENTITY SQL Server 2000中,有三个比较类似的功能:他们分别是:SCOPE_IDENTITY.IDENT_CUR ...

  5. SCOPE_IDENTITY的作用

    SCOPE_IDENTITY返回插入到同一作用域中的 IDENTITY 列内的最后一个 IDENTITY 值.一个作用域就是一个模块——存储过程.触发器.函数或批处理.因此,如果两个语句处于同一个存储 ...

  6. Git使用六:版本对比

    准备工作: 创建一个新的项目,并初始化git 创建两个文件,并写入对应内容(utf-8无bom格式) 执行git add 命令将两个文件添加到暂存区,执行commit命令提交到仓库并生产快照 修改工作 ...

  7. Keystone Federation Identity

    转自 http://wsfdl.com/openstack/2016/01/14/Keystone-Federation-Identity.html Keystone federation ident ...

  8. sql server中常用方法函数

    SQL SERVER常用函数 1.DATEADD在向指定日期加上一段时间的基础上,返回新的 datetime 值. (1)语法: DATEADD ( datepart , number, date ) ...

  9. 【转】SQL 2008 Insert返回自动编号id三种方法比较

    SQL Server 2008中,insert数据的时候返回自动编号的id,有三种方法实现SCOPE_IDENTITY.IDENT_CURRENT 和 @@IDENTITY, 它们都返回插入到 IDE ...

随机推荐

  1. pageEncoding的默认设置

    windows-->preference-->myeclipse-->files and editors-->jsp 右侧 Encoding 选择  ISO 10646/Uni ...

  2. 解析 csv文件 java ***最爱那水货

    /** * csv文件解析 <br> * wx 微信明细数据 第1行是标题 ,最后2行 是总结 提取数据需要过滤<br> * zfb 支付宝明细数据 前4行 和最后4行是总结 ...

  3. ahjesus code simith 存储过程模板

    <%------------------------------------------------------------------------------------------ * Au ...

  4. maven 跳过测试 打包 及上传命令

    [main] ERROR org.apache.maven.cli.MavenCli - Failed to execute goal org.apache.maven.plugins:maven-s ...

  5. Alfresco 4 项目介绍

    body{ font: 16px/1.5em 微软雅黑,arial,verdana,helvetica,sans-serif; }       Alfresco 是一个开源的企业内容管理系统(ECM) ...

  6. 设计一个较好的框架的难点之一--API兼容性的设计

    设计一个好的框架和设计一个好的软件一样,需要考虑的方面很多,比如扩展性.性能.用户体验.稳健性等等,视不同的场景,每个点都可能导致成败,但他们通常并不是老板们关心的,因为在大部分情况下,他们通常都没有 ...

  7. 设计模式之 面向对象的养猪厂的故事,C#演示(一)

    对于设计模式, 从本质上说, 其最大的用途就是适应需求的变化. 因为有了设计模式,我们可以在设计阶段就为未来可能发生的变化留下足够的空间. 我们通过一个建造现代化养猪场的故事, 来讨论一下设计模式与需 ...

  8. JavaScript获取浏览器高度和宽度值

    IE中:  document.body.clientWidth ==> *DY对象宽度 document.body.clientHeight ==> *DY对象高度 document.do ...

  9. JSON数据解析 基础知识及链接收集

    JSON数据解析学习 JSON介绍 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式. JSON 是存储和交换文本信息的语法.类似 XML.但是JSON 比 ...

  10. 操作系统开发系列—12.a.从Loader到内核 ●

    Loader要做两项工作,我们先来做第一项,把内核加载到内存: 1.加载内核到内存. 2.跳入保护模式. 首先编译无内核时: nasm boot.asm -o boot.bin nasm loader ...