正確獲得最新插入行的標識

 

 

這樣的需求很常見,下面就來介紹Transact-SQL提供的三種獲取標識的方法。
(1) IDENT_CURRENT 返回爲某個會話和用域中的指定表生成的最新標識值。
(2) @@IDENTITY 返回爲跨所有作用域的當前會話中的某個表生成的最新標識值。
(3) SCOPE_IDENTITY 返回爲當前會話和當前作用域中的某個表生成的最新標識值。

(1) IDENT_CURRENT 返回爲某個會話和用域中的指定表生成的最新標識值。
    語法:IDENT_CURRENT( 'table_name' )
    說明:通過IDENT_CURRENT獲取的最新標識是不管會話和作用域的,也就是說無論什麼人向指定的表插入新行,它只獲取該表最新行的標識。
    示例:打開兩個查詢窗口(兩個會話),分別在這兩個查詢窗口中寫上INSERT語句,並插入到同一張表。
          在任意一個查詢窗口中寫上SELECT IDENT_CURRENT( 'table_name' );
          結果發現SELECT的返回值是該表最後一次插入時生成的標識。
    備註:如果你想獲取自己剛纔插入的行標識,建議不要用這個方法;
          如果你想獲取整個表最新插入的行標識,建議用這個方法;

exp:

insert into test1 (content) values ('value')
SELECT @@identity

 

(2) @@IDENTITY 返回爲跨所有作用域的當前會話中的某個表生成的最新標識值。
    語法:@@IDENTITY
    說明:首先@@IDENTITY獲取的是當前會話,也就是說不會獲取別人插入的新行標識。它和SCOPE_IDENTITY唯一不同的區別在於,@@IDENTITY是跨作用域的,而SCOPE_IDENTITY是當前作用域。
    示例:兩個表A和B,表A建立觸發器,一旦增加新記錄,觸發器會向表B添加一條新記錄。
          向表A添加一條記錄。
          獲取最新標識 SELECT @@IDENTITY;
          結果發現返回的是表B中新行的標識。
    備註:如果你的當前會話中僅對一個表新增,那麼完全可以用@@IDENTITY獲取最新插入的行標識。
          如果有觸發器他插入,則不能使用該方法。

exp:

insert into test1 (content) values ('value')
SELECT IDENT_CURRENT('test1')

 

(3) SCOPE_IDENTITY 返回爲當前會話和當前作用域中的某個表生成的最新標識值。
    語法:SCOPE_IDENTITY() 
    說明:該方法獲取最新行標識和@@IDENTITY 類似。只是作用域是當前作用域。
    示例:方法同(2);
          結果發現返回值是表A新增的行標識。
    示例:打開兩個查詢窗口(兩個會話),分別在這兩個查詢窗口中寫上INSERT語句,並插入到同一張表。
          在任意一個查詢窗口中寫上SELECT SCOPE_IDENTITY();
          結果發現SELECT的返回值是該窗口所插入的那一行的標識。
    備註:如果你要獲取最新插入的行標識,這個方法是最可靠的

exp:

nsert into test1 (content) values ('value')
SELECT scope_identity()

 

 

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