IDENTITY插入行的最佳方法是什么?
IDENTITY
我知道@@IDENTITY和IDENT_CURRENT和SCOPE_IDENTITY,但不明白连接到每个利弊。
@@IDENTITY
IDENT_CURRENT
SCOPE_IDENTITY
有人可以解释这些差异以及何时使用它们吗?
@@IDENTITY返回在所有范围内为当前会话中的任何表生成的最后一个标识值。 您需要小心 ,因为它是跨作用域的。您可以从触发器获取值,而不是当前语句。
SCOPE_IDENTITY()返回为当前会话和当前范围中的任何表生成的最后一个标识值。 通常,您要使用什么 。
SCOPE_IDENTITY()
IDENT_CURRENT('tableName')返回在任何会话和任何作用域中为特定表生成的最后一个标识值。这可以让您指定要从哪个表中获取值,以防上述两个表不是您真正需要的表( 非常少见 )。另外,正如@GuyStarbuck提到的那样,“如果要获取未插入记录的表的当前IDENTITY值,则可以使用它。”
IDENT_CURRENT('tableName')
该OUTPUT条款的的INSERT声明将让您访问每一个经该语句插入行。由于它是针对特定语句的,因此它比上面的其他函数 更直接 。但是,它有些 冗长 (您需要将其插入到表变量/临时表中,然后对其进行查询),即使在语句回滚的错误情况下,它也可以提供结果。也就是说,如果您的查询使用并行执行计划,则这是 唯一 获得身份的 保证方法 (缺少关闭并行性)。但是,它 在 触发器 之前 执行 , 不能用于返回触发器生成的值。
OUTPUT
INSERT