获取表的标识值,有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. PHP团队编码质量提升之道

    这段文字其实只是标题党. 目前PHP猿的薪资水平普遍较高,但其实绝大多数PHP猿都不是科班出身,你问一个什么是OOP的问题可能都说不清楚. 在团队中,除了费力的去普及编程语言的基础知识,要想提高开发质 ...

  2. MUI(3)

    本篇博文是继续上篇博文MUI(2).上面这幅图是博文MUI(1)中实现的效果,在博文MUI(1)中提到了2个页面,一个页面是index.html,另一个页面是index_list.html页面.上面这 ...

  3. 2016暑假多校联合---Windows 10

    2016暑假多校联合---Windows 10(HDU:5802) Problem Description Long long ago, there was an old monk living on ...

  4. mongodb-java-driver基本用法

    1.先下载mongodb-java-driver 目前最新版本是2.9.3 2.下面是基本的CRUD示例代码: package com.cnblogs.yjmyzz.cache.test; impor ...

  5. Windows 7 性能优化

    1."计算机" 2.右键>"属性" 3."高级系统设置">"高级" 4."性能"> ...

  6. Exif.js 读取图像的元数据

    Exif.js 提供了 JavaScript 读取图像的原始数据的功能扩展,例如:拍照方向.相机设备型号.拍摄时间.ISO 感光度.GPS 地理位置等数据. 注意事项: EXIF 数据主要来自拍摄的照 ...

  7. Linux下Oracle重启问题

    一.切换成oracle用户 $ su - oracle 注意:不要写成“su oracle ”不然是没办法使用下面的命令的. 如下所示:将会报:command not found的错误 二.使用命令 ...

  8. 怎么把多个GridView和Repeater导入到word或者excel中

    最近开发网上商城有发现我们会涉及到订单打印的问题,本来想到直接显示打印即可但是考虑还得下载到本地,最后只有直接选择控件按流方式输出. 导入到word中代码如下: protected void Butt ...

  9. 1:时间戳转换成年月日函数,2:url截取参数方法,3:弹窗自定义方法 4:点击按钮加入购物车

    最近一直在使用vue.js来构建项目,先分享一下一些简单可复用的函数. 1:时间戳转换Date.prototype.format = function(fmt){ //author: yumeiqia ...

  10. js之如何获取css样式

    js之如何获取css样式   一.获取内联样式 1 <div id ="myDiv" style="width:100px;height:100px; border ...