IDENT_CURRENT ,@@identity,SCOPE_IDENTITY() 之间对比

获取表的标识值,有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:
1 INSERT INTO TestTB1 (Data) SELECT 'A'
2 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,写得不好,请各位看官多包涵。多指导

 

 

 

转载于:https://www.cnblogs.com/Gin-23333/p/3988507.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值