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 這個是須要區別sql

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() 會從新計數,以下ide

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,寫得很差,請各位看官多包涵。多指導測試

相關文章
相關標籤/搜索