@@IDENTITY詳細測試

今天看數據庫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

相關文章
相關標籤/搜索