今天看數據庫SQL,有發現存儲過程當中有使用到SCOPE_IDENTITY()這個函數,後來問了下谷歌大嬸,搜到一個比較重要的博客,連接以下:https://dotblogs.com.tw/kkman021/2012/06/27/73096
得知SCOPE_IDENTITY()和@@IDENTITY根本的不一樣,才知道本身還須要學習不少數據庫
@@Identit是會話級別做用域, 下面是針對@@IDENTITY作的測試例子,特此記錄. 若有欠缺各位大神分享,共同進步:)函數
--會話1,第一條返回1,第二條仍是返回1,可得知@@IDENTITY獲取到的是當前會話最近的插入成功的標識符的值 INSERT INTO t(name) values('插入一條') ; SELECT @@IDENTITY; INSERT INTO t SELECT '0個影響' FROM t WHERE 1=2 SELECT @@IDENTITY
--會話1,返回批量插入的最後一個標識符的值(這裏是4),因此這裏max(id)返回的和@@IDENTITY的值是相等的 INSERT INTO t(name) values('插入一條') ,('插入2條') ,('插入3條') SELECT MAX(ID) FROM t; SELECT @@IDENTITY
-- 開啓事務,而後回滾,@@IDENTITY值不會消失 (這裏@@IDENTITY依舊會顯示值,即便沒有插入到數據庫裏面) BEGIN TRAN INSERT INTO t(name) values('插入xx條') SELECT @@IDENTITY; ROLLBACK TRAN select * from t where name='插入xx條'
--會話1,給T表添加了觸發器(給t2(有主鍵,未設置標識符)插入一條數據),這個SQL執行之後,返回的是T表新增數據的標識符。, INSERT INTO t(name) values('插入一條') SELECT @@IDENTITY SELECT MAX(ID) FROM T2;
--會話1,給T表添加了觸發器(給t2(無主鍵,未設置標識符)插入一條數據),這個SQL執行之後,返回的是T表新增數據的標識符。, INSERT INTO t(name) values('插入一條') SELECT @@IDENTITY SELECT MAX(ID) FROM T2;
--會話1,給T表添加了觸發器(給t2(無主鍵,有設置標識符)插入一條數據),這個SQL執行之後,返回的是T2表新增數據的標識符。, INSERT INTO t(name) values('插入一條') SELECT @@IDENTITY SELECT MAX(ID) FROM T2;
--會話1,給T表添加了觸發器(給t2(有主鍵,有標識符)插入一條數據),這個SQL執行之後,返回的是T2表新增數據的標識符。 INSERT INTO t(name) values('插入一條') SELECT @@IDENTITY
BEGIN TRAN --獲取會話級別無觸發器狀況下的最近批處理的標識符 INSERT INTO T(name) VALUES('插入一條數據') SELECT MAX(ID) FROM T; SELECT @@IDENTITY; INSERT INTO T(name) VALUES('插入一條數據') SELECT MAX(ID) FROM T; SELECT @@IDENTITY; COMMIT TRAN
BEGIN TRAN --獲取會話級別有觸發器狀況下的最近批處理的標識符 INSERT INTO T(name) VALUES('插入一條數據') SELECT MAX(ID) FROM T; SELECT @@IDENTITY; INSERT INTO T(name) VALUES('插入一條數據') SELECT MAX(ID) FROM T; SELECT @@IDENTITY; COMMIT TRAN
結論:學習
1. @@IDENTITY是做用域會話級別的,測試
2. @@IDENTITY取的列標識符的列, 由於每一個表只能 有一個列設置爲自動增加spa
參考連接:https://technet.microsoft.com/zh-cn/library/ms187342(SQL.90).aspxcode