导语
有时我们在写SQL语句时,会遇到在插入一条记录的后要立即获取所在数据库中的ID,而该ID是自增生成的。
正文
如果我们要获取自增的ID,最简单的方法就是在INSERT语句之后select @@indentity
,但是如果插入的表有INSERT触发器,那使用select @@indentity
就会不对。
例如,有两个表 T1 和 T2(T1 和 T2 都有 IDENTITY 列),在 T1 上定义了一个 INSERT 触发器。当 T1 插入数据时,T1 的INSERT触发器被触发,并在 T2 中插入一行,这时 @@IDENTITY 返回插入到当前会话中任何作用域内的最后一个 IDENTITY 列值,所以该值是插入 T2 中的ID。
在SQL Server 中还有其他两个函数可以获取插入到 IDENTITY 列中的值,分别是:SCOPE_IDENTITY
、IDENT_CURRENT
,接一下我们来分别了解一下各自的语法。
- @@IDENTITY 返回为当前会话的所有作用域中的任何表最后生成的标识值。
- SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值。
- IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值,它不受作用域和会话的限制,而受限于所指定的表。
按照其语法的来看,我们可以推断出各个函数应用到上面例子中的结果分别是:
- @@IDENTITY 返回插入到当前会话中任何作用域内的最后一个 IDENTITY 列值,该值是插入 T2 中的值。
- SCOPE_IDENTITY 返回插入 T1 中的 IDENTITY 值,该值是发生在相同作用域中的最后一个 INSERT。如果在作用域中发生插入语句到标识列之前唤醒调用 SCOPE_IDENTITY() 函数,则该函数将返回 NULL 值。
- 而IDENT_CURRENT(‘T1’) 和 IDENT_CURRENT(‘T2’) 返回的值分别是这两个表最后自增的值。