2007-11-10

SCOPE_IDENTITY、IDENT_CURRENT and @@IDENTITY

SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY 是類似的函數,因為它們會傳回插入識別資料行的值。
IDENT_CURRENT 不受範圍和工作階段的限制;它只限於指定的資料表。IDENT_CURRENT 會傳回在任何工作階段和任何範圍中,產生給特定資料表的值。
SCOPE_IDENTITY 和 @@IDENTITY 會傳回目前工作階段任何資料表中所產生的最後一個識別值。不過,SCOPE_IDENTITY 會傳回只在目前範圍內插入的值;@@IDENTITY 不限於特定範圍。
例如,有 T1 和 T2 兩份資料表,T1 定義了 INSERT 觸發程序。當資料列插入T1 時,會引發觸發程序,且會在 T2 中插入一個資料列。這個狀況說明兩個範圍:在 T1 插入,以及觸發程序在 T2 插入。
假設 T1 和 T2 都有識別資料行,在 T1 的 INSERT 陳述式結束時,@@IDENTITY 和 SCOPE_IDENTITY 會傳回不同的值。@@IDENTITY 會傳回在目前工作階段中,跨越任何範圍所插入的最後一個識別資料行值。這是在 T2中插入的值。SCOPE_IDENTITY() 會傳回在 T1 中插入的 IDENTITY 值。這是相同範圍內所發生的最後一項插入。如果在範圍內的識別資料行執行任何 INSERT 陳述式之前叫用 SCOPE_IDENTITY() 函數,這個函數會傳回 Null 值。
失敗的陳述式和交易可能會變更資料表的目前識別,以及建立識別資料行值中的間距。識別值永遠不會回復,即使試圖將值插入資料表的交易未獲認可,也是如此。例如,如果 INSERT 陳述式因 IGNORE_DUP_KEY 違規而失敗,資料表的目前識別值仍會遞增。

資料庫有開啟複寫功能的要使用SCOPE_IDENTITY 才能傳回正確的值

沒有留言:

張貼留言