天天看點

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

--=====================================================

--@@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

--------

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

---------

(1 row(s) affected)

SCOPE_IDENTITY

----------

6

--3.IDEN_CURRENT 傳回指定的表或視圖生成的最後一個辨別值

INSERT INTO dbo.ta SELECT 'G'

SELECT IDENT_CURRENT('ta') AS [IDENT_CURRENT_ta];

SELECT IDENT_CURRENT('tb') AS [IDENT_CURRENT_tb];

--Result:

4

7

IDENT_CURRENT_ta

IDENT_CURRENT_tb

--打開新的一個會話,不執行任何插入,如下:

--Result:

---------------------------------------

NULL

總結:

共同點:三者都傳回最後生成的辨別值

不同點:各個函數的因作用域或會話的不同而傳回不同的結果。

● @@IDENTITY 傳回為跨所有作用域的目前會話中的某個表生成的最新辨別值。

● SCOPE_IDENTITY 傳回為目前會話和目前作用域中的某個表生成的最新辨別值。

● IDENT_CURRENT 傳回為某個會話和或作用域中的指定表生成的最新辨別值。