獲取剛剛插入的數據對應的ID

SqlServer中的自增的ID的最後的值:

SELECT SCOPE_IDENTITY() --返回插入到同一作用域中的 IDENTITY 列內的最後一個 IDENTITY 值。
SELECT @@IDENTITY   --返回插入到當前會話中任何作用域內的最後一個 IDENTITY 列值
SELECT IDENT_CURRENT('TbName')--不受作用域和會話的限制,而受限於指定的表。
IDENT_CURRENT 返回爲任何會話和作用域中的特定表所生成的值。

一個作用域就是一個模塊——存儲過程、觸發器、函數或批處理。因此,如果兩個語句處於同一個存儲過程、函數或批處理中,則它們位於相同的作用域中。

對於馬上使用的剛纔插入的新記錄ID用SCOPE_IDENTITY()是最合適的; 
對於想要得到一系列的操作中最後得到的那個自增的ID最好用@@IDENTITY;
對於想要得到一個表中的最後一個插入操作所產生的ID的最好用IDENT_CURRENT('TBName')

 

SQL2000獲得新增行的自動增長列的語句如下:

insert into TestTable (CreatedDate)  values (getdate())

select @@IDENTITY

用select @@identity得到上一次插入記錄時自動產生的ID

如果你使用存儲過程的話,將非常簡單,代碼如下:SET @NewID=@@IDENTITY

@@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 是取全局操作的最後一步操作所產生的自增域的值的。

 

SCOPE_IDENTITY 和 @@IDENTITY 返回在當前會話中的任何表內所生成的最後一個標識值。但是,SCOPE_IDENTITY 只返回插入到當前作用域中的值;@@IDENTITY 不受限於特定的作用域。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章