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()'
1 INSERT INTO TestTB1 (Data) SELECT 'A' 2 SELECT '会话1',@@IDENTITY AS '@@IDENTITY',IDENT_CURRENT('TestTB1') AS 'IDENT_CURRENT()'
INSERT INTO TestTB1 (Data) SELECT 'B' SELECT '会话2',@@IDENTITY AS '@@IDENTITY',IDENT_CURRENT('TestTB1') AS 'IDENT_CURRENT()'
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()'
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,写得很差,请各位看官多包涵。多指导测试