CREATE DATABASE dbdemo;
GO
USE dbdemo;
GO
CREATE TABLE tbldemo (id INT PRIMARY KEY IDENTITY(1,1), name VARCHAR(20));
GO
INSERT INTO tbldemo VALUES ('測試');
SELECT @@IDENTITY; -- 1
SELECT SCOPE_IDENTITY(); -- 1
SELECT IDENT_CURRENT('tbldemo'); -- 1
| 函數 | 作用域 | 觸發器影響 | 適用場景 |
|---|---|---|---|
@@IDENTITY | 目前 Session、所有 Scope、所有 Table | 受影響(回傳觸發器最後 INSERT 的 ID) | 無觸發器的簡單環境 |
SCOPE_IDENTITY() | 目前 Session、目前 Scope、所有 Table | 不受影響(只看目前 Scope) | 最推薦、生產環境首選 |
IDENT_CURRENT('tbl') | 指定 Table、所有 Session、所有 Scope | 不受 Scope 限制 | 跨 Session 監控、複寫稽核 |
CREATE TABLE T1 (id INT IDENTITY, c1 INT);
CREATE TABLE T2 (id INT IDENTITY, c1 INT);
GO
CREATE TRIGGER tr_T1 ON T1 AFTER INSERT AS
INSERT INTO T2 (c1) SELECT 999;
GO
INSERT INTO T1 (c1) VALUES (1);
SELECT @@IDENTITY; -- T2 的 ID
SELECT SCOPE_IDENTITY(); -- T1 的 ID
@@IDENTITY:40 執行緒並發,< 1 萬筆即發生衝突。SCOPE_IDENTITY():同條件測試 零衝突,極度可靠。SCOPE_IDENTITY(),無需額外觸發器。-- 取得指定表下一個自增值
SELECT IDENT_CURRENT('TableName') + IDENT_INCR('TableName');
-- 取得種子與增量
SELECT IDENT_SEED('TableName'), IDENT_INCR('TableName');
LAST_INSERT_ID()RETURNING id INTO :v_id 或 Sequence currvalINSERT ... RETURNING idlast_insert_rowid()生產環境一律使用 SCOPE_IDENTITY(),除非明確需要觸發器產生的 ID。避免使用 @@IDENTITY 造成難以重現的並發 Bug。