多次使用SCOPE_IDENTITY表示多个表

时间:2014-06-02 11:26:29

标签: sql-server-2008

在一个商店程序中多次使用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返回为当前会话中的任何表和当前范围生成的最后一个标识值。

1 个答案:

答案 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违规,表的当前标识值是   仍然增加。

参考: