INSERT INTO dbo.MyTable (Col1, Col2, Col3)
OUTPUT INSERTED.Id -- 直接回傳剛插入列的 Identity 值
VALUES ('A', 'B', 'C');
OUTPUT INSERTED.Id, INSERTED.CreateTime, INSERTED.Col1。INSERTED.*、DELETED.* (用於 UPDATE/DELETE/MERGE)。int newId = (int)cmd.ExecuteScalar();
INSERT INTO dbo.MyTable (Col1, Col2, Col3) VALUES ('A', 'B', 'C');
SELECT @@IDENTITY AS NewId;
GO)。INSERT,@@IDENTITY 會回傳**觸發器內最後插入的 Identity**,而非原資料表的值。ExecuteScalar() 執行批次 SQL。| 函數 | 範圍 | 適用場景 | 風險 |
|---|---|---|---|
SCOPE_IDENTITY() | 目前作用域 (Batch/觸發器/程序) | **最佳替代 @@IDENTITY**,免疫觸發器干擾 | 無 |
IDENT_CURRENT('TableName') | 全伺服器、跨 Session、跨作用域 | 稽核、報表、跨連線查詢最後值 | **高併發下極不準**,不建議用於取得剛插入值 |
OUTPUT INSERTED.Id:語意明確、效能佳、免疫觸發器、可回傳多欄位。@@IDENTITY,**立即改為 SCOPE_IDENTITY()** 修正潛在 Bug。INSERT ... OUTPUT INSERTED.Id INTO @IdTable VALUES ..., ..., ...;IDENT_CURRENT 取得剛插入值,僅供事後稽核參考。取得 Identity 值,**OUTPUT 子句是現代標準**,SCOPE_IDENTITY() 是舊代碼的安全替代,**@@IDENTITY 已棄用 (含觸發器 Bug)**,**IDENT_CURRENT 不適用併發插入**。選對工具,才能在高併發環境下精準拿到屬於你的那個 ID。