--=====================================================
--@@identity , SCOPE_IDENTITY,IDENT_CURRENT 三者的异同 --===================================================== --1.@@IDENTITY: 返回最后插入的标识值 IF OBJECT_ID('dbo.ta') IS NOT NULL DROP TABLE dbo.ta; CREATE TABLE dbo.ta ( ID INT IDENTITY PRIMARY KEY , Col VARCHAR(5) ); INSERT INTO ta SELECT 'A' INSERT INTO ta SELECT 'B' INSERT INTO ta SELECT 'C' SELECT @@IDENTITY AS Iden --Result : Iden -------------- 3 IF OBJECT_ID('dbo.tb') IS NOT NULL DROP TABLE dbo.tb; CREATE TABLE dbo.tb ( tb_id INT IDENTITY PRIMARY KEY , tb_col VARCHAR(5) ); --当触发器存在时, 返回被触发的表Identity列的值,不考虑任何作用域 IF OBJECT_ID('dbo.tr_ta') IS NOT NULL DROP TRIGGER dbo.tr_ta GO CREATE TRIGGER tr_ta ON dbo.ta FOR INSERT AS BEGIN INSERT INTO tb SELECT 'AA' END INSERT INTO ta SELECT 'D' INSERT INTO ta SELECT 'E' SELECT @@IDENTITY AS Iden --返回tb表中Identity列的值为2 --Result : Iden -------- 2 --2.SCOPE_IDENTITY:返回当前作用域中的标识列内的最后一个标识值 INSERT INTO ta SELECT 'F' SELECT @@IDENTITY AS [Identity]; SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]; --Result:返回tb表中最后的Identity为3,当前作用域中最后的Identity为6,即表ta中最后的Identity为6 Identity --------- 3 (1 row(s) affected) SCOPE_IDENTITY ---------- 6 (1 row(s) affected) --3.IDEN_CURRENT 返回指定的表或视图生成的最后一个标识值 INSERT INTO dbo.ta SELECT 'G' SELECT @@IDENTITY AS [Identity]; SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]; SELECT IDENT_CURRENT('ta') AS [IDENT_CURRENT_ta]; SELECT IDENT_CURRENT('tb') AS [IDENT_CURRENT_tb]; --Result: Identity -------------- 4 (1 row(s) affected) SCOPE_IDENTITY -------------- 7 (1 row(s) affected) IDENT_CURRENT_ta -------------- 7 (1 row(s) affected) IDENT_CURRENT_tb -------------- 4 --打开新的一个会话,不执行任何插入,如下: SELECT @@IDENTITY AS [Identity]; SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]; SELECT IDENT_CURRENT('ta') AS [IDENT_CURRENT_ta]; SELECT IDENT_CURRENT('tb') AS [IDENT_CURRENT_tb]; --Result: Identity --------------------------------------- NULL (1 row(s) affected) SCOPE_IDENTITY --------------------------------------- NULL (1 row(s) affected) IDENT_CURRENT_ta --------------------------------------- 7 (1 row(s) affected) IDENT_CURRENT_tb --------------------------------------- 4 总结: 共同点:三者都返回最后生成的标识值 不同点:各个函数的因作用域或会话的不同而返回不同的结果。 ● @@IDENTITY 返回为跨所有作用域的当前会话中的某个表生成的最新标识值。 ● SCOPE_IDENTITY 返回为当前会话和当前作用域中的某个表生成的最新标识值。 ● IDENT_CURRENT 返回为某个会话和或作用域中的指定表生成的最新标识值。 原文链接: