在After Insert觸發器中使用INSERT後,影響SCOPE_IDENTITY 問題

lishan發表於2019-05-11

在SQL SERVER中,給出了三個獲取自增量值的函式:

IDENT_CURRENT   返回為某個會話和用域中的指定表生成的最新標識值。
@@IDENTITY   返回為跨所有作用域的當前會話中的某個表生成的最新標識值。
SCOPE_IDENTITY   返回為當前會話和當前作用域中的某個表生成的最新標識值。

在上述三種方法中,只有IDENT_CURRENT  需要指定表:

IDENT_CURRENT( 'table_name' )

SCOPE_IDENTITY 與 @@IDENTITY不同點:

SCOPE_IDENTITY 只返回插入到當前作用域中的值

@@IDENTITY 不受限於特定的作用域

MSDN事例:

例如,有兩個表 T1 和 T2,並且在 T1 上定義了 INSERT 觸發器。 當將某行插入 T1 時,觸發器激發,並在 T2 中插入一行。 該方案演示了兩個作用域:在 T1 上的插入,以及在 T2 通過觸發器的插入。

假設 T1 和 T2 都有標識列,@@IDENTITY 和 SCOPE_IDENTITY 將在 T1 上的 INSERT 語句結束後返回不同的值。 @@IDENTITY 將返回在當前會話中的任何作用域內插入的最後一個標識列的值。 這是在 T2 中插入的值。 SCOPE_IDENTITY() 將返回在 T1 中插入的 IDENTITY 值。 這是在同一個作用域內發生的最後的插入。 如果在任何 INSERT 語句作用於作用域中的標識列之前呼叫 SCOPE_IDENTITY() 函式,則該函式將返回 Null
總結:推薦大家使用SCOPE_IDENTITY()


龐順龍最後編輯於:4年前

內容均為作者獨立觀點,不代表八零IT人立場,如涉及侵權,請及時告知。

相關文章