获得IDENTITY
条插入行的最佳方法是什么?
我知道@@IDENTITY
、IDENT_CURRENT
和SCOPE_IDENTITY
,但不明白它们各自的利弊.
有人能解释一下它们的区别,以及我应该在什么时候使用它们吗?
获得IDENTITY
条插入行的最佳方法是什么?
我知道@@IDENTITY
、IDENT_CURRENT
和SCOPE_IDENTITY
,但不明白它们各自的利弊.
有人能解释一下它们的区别,以及我应该在什么时候使用它们吗?
@@IDENTITY
返回为当前会话中所有作用域中的任何表生成的最后一个标识值.You need to be careful here,因为它跨越范围.可以从触发器中获取值,而不是当前语句.
SCOPE_IDENTITY()
返回为当前会话和当前作用域中的任何表生成的最后一个标识值.Generally what you want to use
IDENT_CURRENT('tableName')
返回在任何会话和任何作用域中为特定表生成的最后一个标识值.这允许您指定要从哪个表中获取值,以防上面两个表不是您所需要的(very rare).此外,正如@Guy Starbuck所提到的,"如果您想获取尚未插入记录的表的当前标识值,可以使用此选项."
INSERT
语句中的OUTPUT
clause将允许您访问通过该语句插入的每一行.因为它的作用域是特定的语句,所以它比上面的其他函数高more straightforward.然而,它有点more verbose(您需要插入到一个表变量/temp表中,然后查询它),即使在回滚语句的错误场景中,它也会给出结果.也就是说,如果您的查询使用并行执行计划,那么这就是获取标识的方法(除了关闭并行).但是,它由before个触发器执行,不能用于返回触发器生成的值.