我知道Scope_Identity()、Identity()、@@Identity和Ident_Current()都得到了identity列的值,但我很想知道它们之间的区别。
我有争议的一部分是,他们所说的适用于上面这些函数的作用域是什么意思?
我也喜欢一个使用它们的不同场景的简单示例?
发布于 2009-12-17 17:58:08
@@identity函数返回在同一会话中创建的最后一个标识。scope_identity()函数返回在同一会话和相同作用域中创建的最后一个标识。ident_current(name)返回在任何会话中为特定表或视图创建的最后一个标识。select...into查询中创建标识。会话是数据库连接。作用域是当前查询或当前存储过程。
如果表上有触发器,则会出现scope_identity()和@@identity函数不同的情况。如果您有一个插入记录的查询,导致触发器在某处插入另一条记录,则scope_identity()函数将返回查询创建的标识,而@@identity函数将返回触发器创建的标识。
因此,通常您将使用scope_identity()函数。
发布于 2009-12-17 17:48:32
问得好。
@@IDENTITY:返回在您的SQL连接上生成的最后一个标识值(SPID)。statement).SCOPE_IDENTITY():返回当前作用域中生成的最后一个标识值(即,存储过程、触发器、函数、etc).IDENT_CURRENT():返回特定表的最后一个标识值)。不要使用它从INSERT获取identity值,它受竞争条件的约束(即在将表中的列声明为identity列时使用的同一个table).IDENTITY():上插入行的多个连接。有关更多参考信息,请参阅:http://msdn.microsoft.com/en-us/library/ms187342.aspx。
总而言之:如果要插入行,并且希望知道刚刚插入的行的identity列的值,请始终使用SCOPE_IDENTITY()。
发布于 2011-10-11 14:28:48
如果您了解scope和session之间的区别,那么理解这些方法将非常容易。
Adam Anderson的一篇非常好的blog post描述了这种差异:
Session是指正在执行该命令的当前连接。
Scope指的是命令的直接上下文。每个存储过程调用都在其自己的作用域中执行,而嵌套调用则在调用过程的作用域内的嵌套作用域中执行。同样,从应用程序或SSMS执行的SQL命令在其自己的作用域中执行,如果该命令触发任何触发器,则每个触发器都在其自己的嵌套作用域中执行。
因此,这三种身份检索方法之间的区别如下:
@@identity返回在此会话中生成的最后一个标识值,但不返回任何范围。
scope_identity()返回在此会话和此作用域中生成的最后一个标识值。
ident_current()返回在任何会话和任何作用域中为特定表生成的最后一个标识值。
https://stackoverflow.com/questions/1920558
复制相似问题