舊作法:SELECT TOP 1 id FROM table ORDER BY id DESC,併發下極不可靠;加鎖又傷效能。
SQL Server 2005 引入 OUTPUT 子句,可在 INSERT、UPDATE、DELETE 陳述式中直接回傳受影響列的值(含識別欄)。
-- 建立測試表
CREATE TABLE [soloreztest] (
[id] INT IDENTITY(1,1) NOT NULL,
[name] NVARCHAR(50) NULL
);
-- 插入並回傳新 id
INSERT INTO [soloreztest] ([name])
OUTPUT INSERTED.id
VALUES ('solorez');
-- 結果:
-- id
-- ----
-- 5
-- (1 row affected)
-- 驗證
SELECT * FROM [soloreztest];
-- id name
-- 1 solorez
-- 2 solorez
-- 3 solorez
-- 4 solorez
-- 5 solorez
OUTPUT INSERTED.* 可回傳所有欄位;DELETED 用於 UPDATE/DELETE 取得舊值。強烈建議取代舊有 @@IDENTITY、SCOPE_IDENTITY()、IDENT_CURRENT() 等易出錯的方法。