我知道Scope_Identity()、Identity()、@@Identity和Ident_Current()都获取标识列的值,但我想知道其中的区别。
我所面临的部分争议是,应用于上述函数的作用域是什么意思?
我还想举一个简单的例子,说明使用它们的不同场景。
我知道Scope_Identity()、Identity()、@@Identity和Ident_Current()都获取标识列的值,但我想知道其中的区别。
我所面临的部分争议是,应用于上述函数的作用域是什么意思?
我还想举一个简单的例子,说明使用它们的不同场景。
当前回答
用@@身份来澄清问题:
例如,如果您插入一个表,而该表有触发器进行插入,@@Identity将返回触发器中插入的id (log_id或其他),而scope_identity()将返回原始表中插入的id。
因此,如果没有任何触发器,scope_identity()和@@identity将返回相同的值。如果你有触发器,你需要考虑你想要什么值。
其他回答
@@identity函数返回在同一会话中创建的最后一个标识。 scope_identity()函数返回在同一会话和同一作用域中创建的最后一个标识。 ident_current(name)返回在任何会话中为特定表或视图创建的最后一个标识。 identity()函数不是用于获取标识,而是用于在select…into查询中创建标识。
会话是数据库连接。范围是当前查询或当前存储过程。
scope_identity()和@@identity函数不同的情况是,如果您在表上有一个触发器。如果您有一个插入记录的查询,导致触发器在某处插入另一条记录,scope_identity()函数将返回查询创建的标识,而@@identity函数将返回触发器创建的标识。
因此,通常使用scope_identity()函数。
用@@身份来澄清问题:
例如,如果您插入一个表,而该表有触发器进行插入,@@Identity将返回触发器中插入的id (log_id或其他),而scope_identity()将返回原始表中插入的id。
因此,如果没有任何触发器,scope_identity()和@@identity将返回相同的值。如果你有触发器,你需要考虑你想要什么值。
Scope Identity:在正在执行的存储过程中添加的最后一条记录的标识。
@@Identity:在查询批中添加的最后一条记录的标识,或者作为查询的结果,例如,一个执行插入的过程,然后触发一个触发器,然后插入一条记录,将从触发器返回插入记录的标识。
IdentCurrent:为表分配的最后一个标识。
好问题。
@@IDENTITY: returns the last identity value generated on your SQL connection (SPID). Most of the time it will be what you want, but sometimes it isn't (like when a trigger is fired in response to an INSERT, and the trigger executes another INSERT statement). SCOPE_IDENTITY(): returns the last identity value generated in the current scope (i.e. stored procedure, trigger, function, etc). IDENT_CURRENT(): returns the last identity value for a specific table. Don't use this to get the identity value from an INSERT, it's subject to race conditions (i.e. multiple connections inserting rows on the same table). IDENTITY(): used when declaring a column in a table as an identity column.
更多参考,请参见:http://msdn.microsoft.com/en-us/library/ms187342.aspx。
总结一下:如果您正在插入行,并且希望知道刚刚插入行的标识列的值,请始终使用SCOPE_IDENTITY()。
如果你理解了作用域和会话之间的区别,那么理解这些方法就很容易了。
Adam Anderson的一篇很好的博客文章描述了这种差异:
Session表示正在执行命令的当前连接。 作用域是指命令的直接上下文。每个存储过程调用都在自己的作用域中执行,而嵌套调用则在调用过程作用域中的嵌套作用域中执行。同样,从应用程序或SSMS执行的SQL命令在其自己的作用域中执行,如果该命令触发任何触发器,则每个触发器都在其自己的嵌套作用域中执行。
因此,三种身份检索方法的区别如下:
@@identity返回在此会话中生成的最后一个标识值。 Scope_identity()返回在此会话和此范围中生成的最后一个标识值。 Ident_current()返回在任何会话和任何范围内为特定表生成的最后一个标识值。