1. 程式人生 > >SQL Server 獲取剛插入資料的ID號

SQL Server 獲取剛插入資料的ID號

在一條 INSERT、SELECT INTO 或大容量複製語句完成後,@@IDENTITY 中包含語句生成的最後一個標識值。如果語句未影響任何包含標識列的表,則 @@IDENTITY 返回 NULL。如果插入了多個行,生成了多個標識值,則 @@IDENTITY 將返回最後生成的標識值。如果語句觸發了一個或多個觸發器,該觸發器又執行了生成標識值的插入操作,那麼,在語句執行後立即呼叫 @@IDENTITY 將返回觸發器生成的最後一個標識值。如果對包含標識列的表執行插入操作後觸發了觸發器,並且觸發器對另一個沒有標識列的表執行了插入操作,則 @@IDENTITY 將返回第一次插入的標識值。出現 INSERT 或 SELECT INTO 語句失敗或大容量複製失敗,或者事務被回滾的情況時,@@IDENTITY 值不會恢復為以前的設定。

如果語句和事務失敗,它們會更改表的當前標識,從而使標識列中的值出現不連貫現象。即使未提交試圖向表中插入值的事務,也永遠無法回滾標識值。例如,如果因 IGNORE_DUP_KEY 衝突而導致 INSERT 語句失敗,表的當前標識值仍然會增加。

@@IDENTITY、SCOPE_IDENTITY 和 IDENT_CURRENT 是相似的函式,因為他們都返回插入到表的 IDENTITY 列的最後一個值。

@@IDENTITY 和 SCOPE_IDENTITY 可以返回當前會話中的所有表中生成的最後一個標識值。但是,SCOPE_IDENTITY 只在當前作用域內返回值,而 @@IDENTITY 不限於特定的作用域。

IDENT_CURRENT 不受作用域和會話的限制,而受限於指定的表。IDENT_CURRENT 可以返回任何會話和任何作用域中為特定表生成的標識值。有關詳細資訊,請參閱 IDENT_CURRENT (Transact-SQL)

@@IDENTITY 函式的作用域是執行該函式的本地伺服器上的當前會話。此函式不能應用於遠端或連結伺服器。若要獲得其他伺服器上的標識值,請在遠端伺服器或連結伺服器上執 行儲存過程,並使(在遠端或連結伺服器的環境中執行的)該儲存過程收集標識值,並將其返回本地伺服器上的發出呼叫的連線。