获取IDENTITY插入行的最佳方法是什么?
IDENTITY
我知道@@IDENTITY和但不了解每个的优点和缺点IDENT_CURRENT。SCOPE_IDENTITY
@@IDENTITY
IDENT_CURRENT
SCOPE_IDENTITY
有人可以解释一下差异以及我应该何时使用它们吗?
@@IDENTITY返回在所有范围内为当前会话中的任何表生成的最后一个标识值。 您需要在这里小心 ,因为它是跨范围的。您可以从触发器而不是当前语句中获取值。
SCOPE_IDENTITY()返回为当前会话和当前范围中的任何表生成的最后一个标识值。 一般你想用什么 。
SCOPE_IDENTITY()
IDENT_CURRENT('tableName')返回为任何会话和任何范围内的特定表生成的最后一个标识值。这使您可以指定要从哪个表中获取值,以防上述两个不是您所需要的( 非常罕见 )。此外,正如 @ Guy Starbuck所提到的,“如果您想获取尚未插入记录的表的当前 IDENTITY 值,您可以使用它。”
IDENT_CURRENT('tableName')
该语句的OUTPUT子句INSERT将允许您访问通过该语句插入的每一行。由于它的范围仅限于特定语句,因此它比上面的其他函数 更直接。 但是,它有点 冗长 (您需要插入表变量/临时表然后查询它),即使在语句回滚的错误情况下也会给出结果。也就是说,如果您的查询使用并行执行计划,这是获取标识的 唯一保证方法 (没有关闭并行性)。但是,它在触发器 之前 执行,不能用于返回触发器生成的值。
OUTPUT
INSERT