--=====================================================
--@@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 傳回為某個會話和或作用域中的指定表生成的最新辨別值。