国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

IDENT_CURRENT ,@@identity,SCOPE_IDENTITY() 之間對比

2024-07-21 02:49:11
字體:
來源:轉載
供稿:網友
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.TestTB1SELECT '會話2',@@IDENTITY AS '@@IDENTITY',,IDENT_CURRENT('TestTB1') AS 'IDENT_CURRENT()'

模擬一下不同作用域的情況,創建了一個臨時存儲過程#TEST_PRO,就能看到 同一會話不同作用域的SCOPE_IDENTITY() 并不能獲取到種子值
TRUNCATE TABLE dbo.TestTB1goCREATE PROCEDURE #TEST_PROASBEGIN INSERT INTO TestTB1 (Data) SELECT 'A'SELECT @@identity AS '@@identity' ,        SCOPE_IDENTITY() AS 'SCOPE_IDENTITY()' ,        IDENT_CURRENT('TestTB1') AS 'IDENT_CURRENT()'ENDgoEXEC #TEST_PROSELECT @@identity AS '@@identity' ,        SCOPE_IDENTITY() AS 'SCOPE_IDENTITY()' ,        IDENT_CURRENT('TestTB1') AS 'IDENT_CURRENT()'

那嵌套的情況會怎樣呢?再嵌套一層看看,實驗結果是跟上面是一致的,在嵌套情況下,作用域不同,SCOPE_IDENTITY() 會重新計數,如下

TRUNCATE TABLE dbo.TestTB1goCREATE PROCEDURE #TEST_PRO_InnerASBEGIN INSERT INTO TestTB1 (Data) SELECT 'A' SELECT 'TEST_PRO_Inner',  @@identity AS '@@identity' ,        SCOPE_IDENTITY() AS 'SCOPE_IDENTITY()' ,        IDENT_CURRENT('TestTB1') AS 'IDENT_CURRENT()'ENDgoCREATE PROCEDURE #TEST_PROASBEGIN 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()'ENDgoEXEC #TEST_PROSELECT '外部',  @@identity AS '@@identity' ,        SCOPE_IDENTITY() AS 'SCOPE_IDENTITY()' ,        IDENT_CURRENT('TestTB1') AS 'IDENT_CURRENT()'

PS:第一次寫blog,寫得不好,請各位看官多包涵。多指導


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 教育| 黔江区| 福贡县| 松原市| 衡阳县| 九江市| 合阳县| 呼和浩特市| 临朐县| 建昌县| 永年县| 灵石县| 仁寿县| 黔东| 江华| 泰州市| 四会市| 山西省| 博白县| 旅游| 板桥市| 博野县| 顺义区| 宜丰县| 泗洪县| 临沂市| 桐城市| 山阴县| 兰考县| 峡江县| 朝阳区| 山西省| 酉阳| 安岳县| 乌苏市| 平顶山市| 神木县| 高雄县| 易门县| 南岸区| 南昌县|