@@IDENTYITY,SCOPE_IDENTITY的主要區別:在有觸發器中並且觸發器的內容裏面含有插入標識符的操做的時候,@@IDENTITY則返回的是觸發器裏面新插入標識符的值而SCOPE_IDENTITY則是不變,即離該語句上面最近的標識符的值。sql
SCOPE_IDENTITY()測試用例:數據庫
--會話1,第一條返回1,第二條仍是返回1,可得知SCOPE_IDENTITY()獲取到的是當前會話最近的插入成功的標識符的值 INSERT INTO t(name) values('插入一條') ; SELECT SCOPE_IDENTITY(); INSERT INTO t SELECT '0個影響' FROM t WHERE 1=2 SELECT SCOPE_IDENTITY()
--會話1,返回批量插入的最後一個標識符的值(這裏是4),因此這裏max(id)返回的值和SCOPE_IDENTITY()的值是相等的 INSERT INTO t(name) values('插入一條') ,('插入2條') ,('插入3條') SELECT MAX(ID) FROM t; SELECT SCOPE_IDENTITY();
-- 開啓事務,而後回滾,SCOPE_IDENTITY()值不會消失 (這裏SCOPE_IDENTITY()依舊會顯示值,即便沒有插入到數據庫裏面) BEGIN TRAN INSERT INTO t(name) values('插入xx條') SELECT SCOPE_IDENTITY() ROLLBACK TRAN select * from t where name='插入xx條'
--給T表添加一個觸發器,觸發器功能是給t2表(有主鍵,未設置標識符)插入一條記錄,執行後返回的是T表的值。 INSERT INTO t(name) values('插入一條') SELECT SCOPE_IDENTITY() SELECT MAX(ID) FROM T2;
--給T表添加一個觸發器,觸發器功能是給t2表(無主鍵,未設置標識符)插入一條記錄,執行後返回的是T表的值。 INSERT INTO t(name) values('插入一條') SELECT SCOPE_IDENTITY() SELECT MAX(ID) FROM T2;
--給T表添加一個觸發器,觸發器功能是給t2表(有主鍵,有設置標識符)插入一條記錄,執行後返回的是T表的值(這個是和@@IDENTITY根本的不一樣,@@IDENTITY返回的是T2表的標識符的值) INSERT INTO t(name) values('插入一條') SELECT SCOPE_IDENTITY() SELECT MAX(ID) FROM T2;
--給T表添加一個觸發器,觸發器功能是給t2表(無主鍵,有設置標識符)插入一條記錄,執行後返回的是T表的值(這個是和@@IDENTITY根本的不一樣,@@IDENTITY返回的是T2表的標識符的值) INSERT INTO t(name) values('插入一條') SELECT SCOPE_IDENTITY() SELECT MAX(ID) FROM T2;
BEGIN TRAN --獲取會話級別無觸發器狀況下的最近批處理的標識符 INSERT INTO T(name) VALUES('插入一條數據') SELECT MAX(ID) FROM T; SELECT SCOPE_IDENTITY(); INSERT INTO T(name) VALUES('插入一條數據') SELECT MAX(ID) FROM T; SELECT SCOPE_IDENTITY(); COMMIT TRAN
BEGIN TRAN --獲取會話級別無觸發器狀況下的最近批處理的標識符 INSERT INTO T(name) VALUES('插入一條數據') SELECT MAX(ID) FROM T; SELECT SCOPE_IDENTITY(); INSERT INTO T(name) VALUES('插入一條數據') SELECT MAX(ID) FROM T; SELECT SCOPE_IDENTITY(); COMMIT TRAN
參考資料:https://msdn.microsoft.com/zh-cn/library/ms190315(v=sql.90).aspx測試