回答

收藏

获得插入行身份的最佳方法?

技术问答 技术问答 121 人阅读 | 0 人回复 | 2023-09-13

IDENTITY插入行的最佳方法是什么?0 n+ L, r# o1 g; _7 ^  ^5 u1 K* E1 H4 S
我知道@@IDENTITY和IDENT_CURRENT和SCOPE_IDENTITY,但不明白连接到每个利弊。* [$ k. V# B& g* B
有人可以解释这些差异以及何时使用它们吗?# s5 B: X- H$ R
               
6 h; S0 R( W& j' u6 b- N解决方案:
! P% F  D1 u1 G               
; \4 U& `/ Z+ w+ `& n; w% D) j! b& X2 a

8 H9 h! ^2 N- w; _: w2 K               
' w: `! f  c6 I2 o7 [@@IDENTITY返回在所有范围内为当前会话中的任何表生成的最后一个标识值。 您需要小心 ,因为它是跨作用域的。您可以从触发器获取值,而不是当前语句。
5 o) o  d: e. q) B# I. q4 d2 M
+ n$ o- V8 n5 i: d: n3 L  \8 x6 _SCOPE_IDENTITY()返回为当前会话和当前范围中的任何表生成的最后一个标识值。 通常,您要使用什么1 k  `- l, W& H4 U3 x7 s1 v

! b9 z9 H3 K# N5 y+ TIDENT_CURRENT('tableName')返回在任何会话和任何作用域中为特定表生成的最后一个标识值。这可以让您指定要从哪个表中获取值,以防上述两个表不是您真正需要的表( 非常少见 )。另外,正如@GuyStarbuck提到的那样,“如果要获取未插入记录的表的当前IDENTITY值,则可以使用它。”! w+ P3 o3 t: P* ]

& f- ~: M: `$ w. m3 T) X) I- P该OUTPUT条款的的INSERT声明将让您访问每一个经该语句插入行。由于它是针对特定语句的,因此它比上面的其他函数 更直接 。但是,它有些 冗长 (您需要将其插入到表变量/临时表中,然后对其进行查询),即使在语句回滚的错误情况下,它也可以提供结果。也就是说,如果您的查询使用并行执行计划,则这是 唯一 获得身份的 保证方法 (缺少关闭并行性)。但是,它 在 触发器 之前 执行 , 不能用于返回触发器生成的值。
+ x' S+ q: f6 H( v! V' _6 v2 b8 A% O* `. T5 I
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则