获取表的标识值,有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. Struts 2.0全面分析

    Struts 2.0 struts 1---前端控制+应用控制+命令模式 webwork ---控制器+拦截器+代理 Struts 2.0 继承了WebWork的设计理念,并没有继承struts 1, ...

  2. 良好Web系统架构的几个因素

    好像以前整理过一些思路. 这里的架构不是指纵向的架构,而是横向的架构方面. 三个词:挂件化.模块化.钩子化.

  3. RPM Version Comparison

    https://fedoraproject.org/wiki/Archive:Tools/RPM/VersionComparison?rd=Tools/RPM/VersionComparison ht ...

  4. 上中下三个DIV,高度自适应(上高度固定,下固定,中间自适应)(代码来自X人)

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="DivDemo.aspx.c ...

  5. Statement和PreparedStatement的区别; 什么是SQL注入,怎么防止SQL注入?

    问题一:Statement和PreparedStatement的区别 先来说说,什么是java中的Statement:Statement是java执行数据库操作的一个重要方法,用于在已经建立数据库连接 ...

  6. Scalaz(50)- scalaz-stream: 安全的无穷运算-running infinite stream freely

    scalaz-stream支持无穷数据流(infinite stream),这本身是它强大的功能之一,试想有多少系统需要通过无穷运算才能得以实现.这是因为外界的输入是不可预料的,对于系统本身就是无穷的 ...

  7. android 6.0添加权限

        @Override    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissio ...

  8. SQLSERVER 2012计算上一条,下一条数据的函数

    实际需求很普遍,比如求销售数据的每天与头一天的销售增长量.这里用一个汽车行驶数据来做例子: 先初始化数据: CREATE TABLE [dbo].[CarData]( [CarID] [int] NU ...

  9. iCheck.js

    一.iCheck:http://www.bootcss.com/p/icheck/ 1.选择一个颜色主题,网上有,有了一个肤色主题,然后就是把这个肤色主题的css文件复制到iCheck文件夹里面 2. ...

  10. jScrollPane 美化滚动条

    在线实例 滚动条可见 滚动条隐藏 使用方法 <div class="container"> <h1>滚动条可见</h1> <div cla ...