我理解@@IDENTITY
和SCOPE_IDENTITY
之间的差异,但我很难确切地知道它们是如何生成的。
所有文档都告诉我这些函数返回添加到表中的最后一条记录的ID,但是如果我有一个包含INSERT语句的存储过程,那么该过程是一个可能会被大量使用的数据库的一部分由多个用户同时执行,如果这两个用户都将记录插入到相隔一秒的相同表分数中,是否可能从存储过程权限调用@@IDENTITY
或SCOPE_IDENTITY
在INSERT语句之后,它们实际上可以返回由其他用户插入的记录的ID吗?
我认为答案是SCOPE_IDENTITY
会避免这种情况,因为顾名思义,它会获得从SCOPE_IDENTITY
调用范围内添加的最后一条记录的标识(在这种情况下) ,从同一个存储过程中),但由于我不完全确定范围的定义是什么,我不知道我是否正确地思考这个。
答案 0 :(得分:3)
@@identity
和scope_identity()
都会返回同一用户创建的记录的ID。
@@identity
函数返回在同一会话中创建的id。会话是数据库连接,因此通常与用户相同。
scope_identity()
函数返回在同一会话和相同范围内创建的id。范围是当前查询或当前存储过程。
因此,它们之间的区别在于,例如,如果您从另一个过程调用过程;如果被调用的过程插入记录,则在调用后使用@@identity
将返回该ID,但scope_identity()
不会。
答案 1 :(得分:1)
在我知道更好之前回过头来运行像
这样的查询select max(id) from table
获取刚刚插入的记录的ID。当你在多个用户同时添加记录的生产环境中使用这样的东西时,会发生不好的事情。
您暗示@@ Identity和scope_identity()的工作方式与上面的查询相同。事实并非如此。它们都返回通过插入仅在当前用户的会话中生成的标识列的值!如果您的表具有触发器并且触发器逻辑执行它自己的插入,则Scope_Identity()非常有用。在这些情况下,@@ Identity将返回触发器中生成的标识值,这可能不是您想要的。出于这个原因,我几乎总是喜欢Scope_Identity()到@@ Identity