這樣的需求很常見,下面就來介紹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()