Sql @Identity和Scope\u Identity是否总是返回刚才添加的记录?
我想我理解Sql @Identity和Scope\u Identity是否总是返回刚才添加的记录?,sql,sql-server-2012,identity-column,Sql,Sql Server 2012,Identity Column,我想我理解@@IDENTITY和SCOPE\u IDENTITY之间的区别,但我很难弄清楚它们是如何生成的 所有文档都告诉我,这些函数返回添加到表中的最后一条记录的ID,但是如果我有一个包含INSERT语句的存储过程,并且该过程是大量使用的数据库的一部分,可以由多个用户同时执行,如果这两个用户都在同一个表中插入一条记录,相隔几秒钟,如果我在insert语句之后立即从存储过程调用@@IDENTITY或SCOPE\u IDENTITY,他们是否可能返回由其他用户插入的记录的ID 我认为答案是,SCO
@@IDENTITY
和SCOPE\u IDENTITY
之间的区别,但我很难弄清楚它们是如何生成的
所有文档都告诉我,这些函数返回添加到表中的最后一条记录的ID,但是如果我有一个包含INSERT语句的存储过程,并且该过程是大量使用的数据库的一部分,可以由多个用户同时执行,如果这两个用户都在同一个表中插入一条记录,相隔几秒钟,如果我在insert语句之后立即从存储过程调用@@IDENTITY
或SCOPE\u IDENTITY
,他们是否可能返回由其他用户插入的记录的ID
我认为答案是,
SCOPE\u IDENTITY
可以避免这种情况,因为顾名思义,它获取从调用SCOPE\u IDENTITY
的范围内添加的最后一条记录的标识(在本例中,来自同一存储过程),但由于我不完全确定作用域的定义是什么,我不知道我的想法是否正确。这两个@@identity
和scope\u identity()
都将返回同一用户创建的记录的id
@@identity
函数返回在同一会话中创建的id。会话是数据库连接,因此这通常与用户相同
scope\u identity()
函数返回在同一会话和同一作用域中创建的id。作用域是当前查询或当前存储过程
因此,它们之间的区别在于,例如,如果您从另一个过程调用一个过程;如果被调用的过程插入一条记录,则在调用后使用
@@identity
将返回该id,但scope\u identity()
将不返回该id。两个@@identity
和scope\u identity()
都将返回由同一用户创建的记录的id
@@identity
函数返回在同一会话中创建的id。会话是数据库连接,因此这通常与用户相同
scope\u identity()
函数返回在同一会话和同一作用域中创建的id。作用域是当前查询或当前存储过程
因此,它们之间的区别在于,例如,如果您从另一个过程调用一个过程;如果被调用的过程插入一条记录,则在调用后使用
@@identity
将返回该id,但scope\u identity()
将不会返回该id。早在我清楚地知道之前,我运行了一个类似
select max(id) from table
获取我刚刚插入的记录的ID。当您在生产环境中使用类似的方法时,多个用户同时添加记录,就会发生不好的事情
您的意思是@Identity和scope_Identity()的工作方式与上面的查询相同。事实并非如此。它们都只返回通过插入在当前用户会话中生成的标识列的值!。如果表上有触发器,并且触发器逻辑执行自己的插入,则Scope_Identity()非常有用。在这种情况下,@@Identity将返回触发器中生成的Identity值,这可能不是您想要的。正是因为这个原因,我几乎总是更喜欢Scope_Identity()而不是@Identity早在我知道如何更好地运行这样的查询之前
select max(id) from table
获取我刚刚插入的记录的ID。当您在生产环境中使用类似的方法时,多个用户同时添加记录,就会发生不好的事情
您的意思是@Identity和scope_Identity()的工作方式与上面的查询相同。事实并非如此。它们都只返回通过插入在当前用户会话中生成的标识列的值!。如果表上有触发器,并且触发器逻辑执行自己的插入,则Scope_Identity()非常有用。在这种情况下,@@Identity将返回触发器中生成的Identity值,这可能不是您想要的。出于这个原因,我几乎总是更喜欢Scope_Identity()而不是@Identity可能值得阅读备注部分,该部分还试图指出这三个函数之间的差异。可能值得阅读备注部分,该部分还试图指出这三个函数之间的差异。