這是我遇到的一個面試題,看了一些文章后, 總結如下
SQL Server中,需要返回你剛剛插入到一張表的identity(自增字段)的值, 有3個關鍵字,分別是
@@IDENTITY
SCOPE_IDENTITY
IDENT_CURRENT
這3者之間有什么樣的區別呢,我們來看看
IDENT_CURRENT => 它針對的是特定的表,所以它的使用方式為 IDENT_CURRENT('Table Name'), 比如Person這張表,它的使用方式就是IDENT_CURRENT('Person'), 它會取出最后一次插入Person表的自增的值.
@@IDENTITY => 它返回當前會話中,所有作用域的任何表中,最后一個插入的自增標識值
SCOPE_IDENTITY => 它返回當前會話中,當前作用域中的任何表中,最后一個插入的自增標識值
我們來看看這兩者的區別: 假如有2張關聯表Person和Account, PersonId 和 AccountId分別是自增字段.
在Person表中定義了一個INSERT的觸發器, 當在Person表中插入一行時,觸發器被激發,同時需要在Account表中插入一行
這整個是1個會話,但上面涉及到了2個作用域: 第1個作用域是 在Person表中插入1行 第2個作用域是在Account表中插入1行
這樣,上面2個返回的值就不一樣了
@@IDENTITY => 返回當前會話,所有作用域中的任何表中,最后一個插入的自增標識值 => AccountId
SCOPEN_IDENTITY => 它返回當前會話中,當前作用域的任何表中,最后一個插入的自增標識值 => PersonId