回答

收藏

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

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

IDENTITY插入行的最佳方法是什么?
0 q7 O3 @, y2 H我知道@@IDENTITY和IDENT_CURRENT和SCOPE_IDENTITY,但不明白连接到每个利弊。
4 U, p* T2 ]% z' i, a- A, M& v  m有人可以解释这些差异以及何时使用它们吗?' Y. p* p$ G2 Q! C8 s
               
- _5 H7 ~/ b( Z% ?5 Y# V1 M- {解决方案:
/ W, O/ a$ c6 A5 @+ e                1 C! N6 ?2 p! D) j

. {9 D3 S! ^5 X9 [( U7 ~5 C: H7 b2 k7 B: _
               
4 r' t3 X$ k( h) s5 c@@IDENTITY返回在所有范围内为当前会话中的任何表生成的最后一个标识值。 您需要小心 ,因为它是跨作用域的。您可以从触发器获取值,而不是当前语句。2 w( j! J1 y7 e9 E8 e, ~" Q6 Y

# n% A# Q: b) u4 S3 r3 GSCOPE_IDENTITY()返回为当前会话和当前范围中的任何表生成的最后一个标识值。 通常,您要使用什么
) b1 X( f3 H' G: J! l* Z
; T' `" i; ?) H3 _$ wIDENT_CURRENT('tableName')返回在任何会话和任何作用域中为特定表生成的最后一个标识值。这可以让您指定要从哪个表中获取值,以防上述两个表不是您真正需要的表( 非常少见 )。另外,正如@GuyStarbuck提到的那样,“如果要获取未插入记录的表的当前IDENTITY值,则可以使用它。”! j) ^* p# e9 a2 J

( F. S& G) I- |7 F% S- m8 O' [$ Z) J该OUTPUT条款的的INSERT声明将让您访问每一个经该语句插入行。由于它是针对特定语句的,因此它比上面的其他函数 更直接 。但是,它有些 冗长 (您需要将其插入到表变量/临时表中,然后对其进行查询),即使在语句回滚的错误情况下,它也可以提供结果。也就是说,如果您的查询使用并行执行计划,则这是 唯一 获得身份的 保证方法 (缺少关闭并行性)。但是,它 在 触发器 之前 执行 , 不能用于返回触发器生成的值。5 T& K+ v9 \6 w; Y- y! r/ M, N

6 [" q+ y4 Z) W# W0 X4 E# W
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则