在一个商店程序中多次使用SCOPE_IDENTITY()是否可以?是否有可能出现错误的SCOPE_IDENTITY值?
在sp中,三个不同的表有三个不同的insert语句,表A SCOPE_IDENTITY值传递到表B,表B SCOPE_IDENTITY值传递到表C.
我将SCOPE_IDENTITY值保存到变量第一个
SET @EmpID = SCOPE_IDENTITY();
然后将@EmpID传递给insert语句。
是否有多次使用SCOPE_IDENTITY()的风险?
另外,我认为SCOPE_IDENTITY对我来说是最好的选择;
•IDENT_CURRENT返回在任何会话和任何范围内为特定表生成的最后一个标识值。
•@@ IDENTITY返回在所有范围内为当前会话中的任何表生成的最后一个标识值。
•SCOPE_IDENTITY返回为当前会话中的任何表和当前范围生成的最后一个标识值。
答案 0 :(得分:0)
阅读msdn。我认为SCOPE_IDENTITY
是您的最佳选择。 SCOPE_IDENTITY将始终返回目标范围中最后插入的id。 @@ IDENTITY不是一个好的选择,因为它可以从相关的触发器返回id。在这里阅读更多内容:
SCOPE_IDENTITY,IDENT_CURRENT和@@ IDENTITY是类似的功能 因为它们返回插入到标识列中的值。 IDENT_CURRENT不受范围和会话的限制;它仅限于a 指定表。 IDENT_CURRENT返回为a生成的值 任何会话和任何范围内的特定表。有关更多信息,请参阅 IDENT_CURRENT(Transact-SQL)。 SCOPE_IDENTITY和@@ IDENTITY返回 在当前任何表中生成的最后一个标识值 会话。但是,SCOPE_IDENTITY返回仅在其中插入的值 目前的范围; @@ IDENTITY不限于特定范围。对于 例如,有两个表,T1和T2,以及INSERT触发器 在T1上定义。当一行插入T1时,触发器会触发 在T2中插入一行。此方案说明了两个范围:插入 在T1上,并在触发器上插入T2。假设T1和 T2有标识列,@@ IDENTITY和SCOPE_IDENTITY将返回 T1上INSERT语句末尾的不同值。 @@ IDENTITY 将返回跨任何范围插入的最后一个标识列值 在本届会议上。这是在T2中插入的值。 SCOPE_IDENTITY()将返回在T1中插入的IDENTITY值。这个 是在同一范围内发生的最后一次插入。该 如果函数,SCOPE_IDENTITY()函数将返回null值 在发生任何INSERT语句进入标识列之前调用 在范围内。失败的语句和事务可以改变 表的当前标识并在标识列中创建间隙 值。即使是,身份值也永远不会回滚 试图将值插入表中的事务不是 承诺。例如,如果INSERT语句因为a而失败 IGNORE_DUP_KEY违规,表的当前标识值是 仍然增加。
参考: