Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql @Identity和Scope\u Identity是否总是返回刚才添加的记录?_Sql_Sql Server 2012_Identity Column - Fatal编程技术网

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

可能值得阅读备注部分,该部分还试图指出这三个函数之间的差异。可能值得阅读备注部分,该部分还试图指出这三个函数之间的差异。