SQL筆記:SQL先插入資料後取回PK/Index值

在寫資料庫的時候一定會遇到先把資料寫入,再取回鍵值(Primary Key, PK)或AutoIndex自動增量值的情境,這時候你有三種方式可以選擇。

@@IDENTITY、SCOPE_IDENTITY和IDENT_CURRENT是類似的函數,因為它們都會傳回最後插入資料表之IDENTITY資料行的值。

SCOPE_IDENTITY與@@IDENTITY

SCOPE_IDENTITY和@@IDENTITY都會傳回資料表中所產生的最後一個識別值。

SCOPE_IDENTITY:執行這個程序會回傳目前當前作業的資料表中,最後增加的編號值。「範例:SELECT SCOPE_IDENTITY();」

@@IDENTITY:這個就是回傳目前資料庫的所有作業中,最後一個新增的自動編號值,應該不會用到。「範例:SELECT @@IDENTITY」

所以插入一筆資料後取回PK值的SQL語法大概會長的如下:

INSERT INTO [Table]
  ...
VALUES
  ...;
SELECT CAST(SCOPE_IDENTITY() AS int);

IDENT_CURRENT

IDENT_CURRENT不受範圍和工作階段的限制;它只限於指定的資料表。IDENT_CURRENT會傳回在任何工作階段和任何範圍中,產生給特定資料表的識別值。「範例:SELECT IDENT_CURRENT('table name')」

建議做法:

由於微軟自己都說這兩種做法也有可能會有取到錯誤的數值:(You may receive incorrect values when using SCOPE_IDENTITY() and @@IDENTITY),因此如果你的SQL Server允許的話,建議使用OUTPUT語句(OUTPUT Clause)來進行,會來的穩定一些。

INSERT INTO [Table]
  ...
OUTPUT
  INSERTED.iAutoIndex  //這張資料表的索引欄位名稱
VALUES
  ...

參考網址:

  1. http://goo.gl/CmPyP
  2. http://goo.gl/uEWWU
SQL Command PK Index iAutoIndex 先寫入資料再取回索引值