@@identity , SCOPE_IDENTITY,IDENT_CURRENT 三者的异同 

http://blog.csdn.net/leshami/article/details/5181147

 

--=====================================================
--@@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 返回为某个会话和或作用域中的指定表生成的最新标识值。