最簡單做法
INSERT INTO tbldemo VALUES ('測試');
SELECT @@IDENTITY;
三大函數比較
| 函數 | 範圍 | Session | 說明 |
@@IDENTITY | 所有作用域、所有資料表 | 目前 Session | 回傳目前 Session 最後產生的身分識別值,包含觸發器產生的值 |
SCOPE_IDENTITY() | 目前作用域、所有資料表 | 目前 Session | 回傳目前作用域最後產生的值,**不包含觸發器/巢狀作用域** |
IDENT_CURRENT('table_name') | 指定資料表 | 所有 Session | 回傳指定資料表最後產生的值,**跨 Session 可見** |
觸發器情境範例
-- 資料表 T1、T2 皆有 IDENTITY 欄位
-- T1 上有 INSERT 觸發器,觸發時向 T2 插入一列
INSERT INTO T1 ...; -- 觸發器隱性插入 T2
SELECT @@IDENTITY; -- 回傳 T2 的 IDENTITY 值
SELECT SCOPE_IDENTITY(); -- 回傳 T1 的 IDENTITY 值
建議
- 一般應用 優先使用
SCOPE_IDENTITY(),避免觸發器干擾
- 需跨 Session 取得特定資料表最新值時用
IDENT_CURRENT
@@IDENTITY 相容性最好,但風險最高
完整建表與測試腳本
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 AS [@@IDENTITY], SCOPE_IDENTITY() AS [SCOPE_IDENTITY], IDENT_CURRENT('tbldemo') AS [IDENT_CURRENT];