標籤:style http color io os 使用 ar strong 資料
原文地址:http://www.studyofnet.com/news/145.html
本文導讀:@@IDENTITY是返回上次插入的標識值,標識值一般指的是自動成長值。但是如果想只返回插入到當前範圍中的值,則使用SCOPE_IDENTITY 。
用法:
用select @@identity得到上一次插入記錄時自動產生的ID
如果你使用預存程序的話,將非常簡單,代碼如下:SET @[email protected]@IDENTITY
說明:
在一條 INSERT、SELECT INTO 或大量複製陳述式完成後,@@IDENTITY 中包含此語句產生的最後的標識值。若此語句沒有影響任何有識別欄位的表,則 @@IDENTITY 返回 NULL。若插入了多個行,則會產生多個標識值,@@IDENTITY 返回最後產生的標識值。如果此語句激發一個或多個執行產生標識值的插入操作的觸發器,則語句執行後立即調用 @@IDENTITY 將返回由觸發器產生的最後的標識值。若 INSERT 或 SELECT INTO 語句失敗或大量複製失敗,或事務被復原,則 @@IDENTITY 值不會還原為以前的設定。
如果語句和事務失敗,它們會更改表的當前標識,從而使識別欄位中的值出現不連貫現象。即使未提交試圖向表中插入值的事務,也永遠無法復原標識值。例如,如果因 IGNORE_DUP_KEY 衝突而導致 INSERT 語句失敗,表的當前標識值仍然會增加。
在返回插入到表的 @@IDENTITY 列的最後一個值方面,@@IDENTITY、SCOPE_IDENTITY 和 IDENT_CURRENT 函數類似。
@@IDENTITY 和 SCOPE_IDENTITY 將返回在當前會話的所有表中產生的最後一個標識值。但是,SCOPE_IDENTITY 只在當前範圍內傳回值,而 @@IDENTITY 不限於特定的範圍。
@@identity執行個體
USE AdventureWorks;
GO
--Display the value of LocationID in the last row in the table.
SELECT MAX(LocationID) FROM Production.Location;
GO
INSERT INTO Production.Location (Name, CostRate, Availability, ModifiedDate)
VALUES (‘Damaged Goods‘, 5, 2.5, GETDATE());
GO
SELECT @@IDENTITY AS ‘Identity‘;
GO
--Display the value of LocationID of the newly inserted row.
SELECT MAX(LocationID) FROM Production.Location;
GO
@@identity使用注意事項:
我們要慎用@@IDENTITY,原因是 @@IDENTITY 它總是擷取最後一條變更資料的自增欄位的值,
而忽略了進行變更操作所在的範圍約束。比如,我有表 A 和表 B 兩個表,現在我在表 A 上定義了一個Insert觸發器,當在表 A 中插入一條資料時,自動在表 B 也插入一條資料。此時,大家注意,有兩個原子操作:在A中插入一條資料, 接著在B中隨後插入一條資料。
現在我們想下,假設上面表 A 和表 B 都有IDENTITY自增域,那麼我們在表 A 插入一條資料後,使用了 SELECT @@IDENTITY 輸出時,輸出的到底是 A 還是 B 的自增域的值呢? 答案很明顯,是誰最後插入就輸出誰,那麼就是 B 了。於是,我本意是想得到 A 的自增域值,結果得到了 B 的自增域值,一隻 BUG 隨之誕生,搞不好還會影響到整個系統資料的混亂。
因此,對於這種情況,建議大家慎用 @@IDENTITY,而盡量採用 SCOPE_IDENTITY() 函數替換之。SCOPE_IDENTITY() 也是得到最後一條自增域的值,但是它是僅限在一個操作範圍之內,而不@@IDENTITY 是取全域操作的最後一步操作所產生的自增域的值的。
SQL Server 中@@IDENTITY的用法