SCOPE_IDENTITY()

 

@@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測試

本站公眾號
   歡迎關注本站公眾號,獲取更多信息