@@IDENTITY 返回最后插入的每个表的标识值,所以对于所有范围。
我有一个允许用户整天在数据库中插入数据的应用程序。另一方面,我有一些用于一些数据导入的脚本,我在游标中使用@@IDENTITY 来获取每一行标识并将其放在某个日志表中。
现在,@@IDENTITY 是否可以从用户插入中选择身份,并在我的日志表中弄得一团糟?
@@IDENTITY 返回最后插入的每个表的标识值,所以对于所有范围。
我有一个允许用户整天在数据库中插入数据的应用程序。另一方面,我有一些用于一些数据导入的脚本,我在游标中使用@@IDENTITY 来获取每一行标识并将其放在某个日志表中。
现在,@@IDENTITY 是否可以从用户插入中选择身份,并在我的日志表中弄得一团糟?
返回插入到同一范围内的标识列中的最后一个标识值。范围是一个模块:存储过程、触发器、函数或批处理。因此,如果两条语句在同一个存储过程、函数或批处理中,则它们属于同一范围。
(您需要使用任何东西但SCOPE_IDENTITY()
很少的情况)。
正如所@Damien_The_Unbeliever
指出的,上面的链接包括对使用的用途/好处/缺点的讨论@@IDENTITY
,SCOPE_IDENTITY()
以及IDENT_CURRENT
希望下文能给你答案。我认为您的情况应该使用 SCOPE_IDENTITY()
@@身份
它返回在所有范围内为当前会话中的任何表生成的最后一个标识值。
让我解释一下……假设我们在表上创建了一个插入触发器,该触发器在另一个表中插入一行并生成一个标识列,然后@@IDENTITY 返回由触发器创建的标识记录。
SCOPE_IDENTITY
它返回为当前会话和当前范围中的任何表生成的最后一个标识值。
让我解释一下……假设我们在表上创建了一个插入触发器,该触发器在另一个表中插入一行并生成一个标识列,那么 SCOPE_IDENTITY 结果不受影响,但如果触发器或用户定义的函数在同一张表上受到影响产生的值返回该身份记录,然后 SCOPE_IDENTITY 返回由触发器或用户定义的函数创建的身份记录。
IDENT_CURRENT
它返回为任何会话和任何范围内的特定表生成的最后一个标识值。
换句话说,我们可以说它不受作用域和会话的影响,它只依赖于特定的表,并返回在任何会话或作用域中生成的与表相关的标识值。
参考取自这里