首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scope_Identity()、Identity()、@@Identity和Ident_Current()之间有什么区别?

Scope_Identity()、Identity()、@@Identity和Ident_Current()之间有什么区别?
EN

Stack Overflow用户
提问于 2009-12-17 17:42:55
回答 7查看 167.1K关注 0票数 236

我知道Scope_Identity()Identity()@@IdentityIdent_Current()都得到了identity列的值,但我很想知道它们之间的区别。

我有争议的一部分是,他们所说的适用于上面这些函数的作用域是什么意思?

我也喜欢一个使用它们的不同场景的简单示例?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-12-17 17:58:08

  • @@identity函数返回在同一会话中创建的最后一个标识。
  • scope_identity()函数返回在同一会话和相同作用域中创建的最后一个标识。
  • ident_current(name)返回在任何会话中为特定表或视图创建的最后一个标识。
  • 函数不用于获取标识,它用于在select...into查询中创建标识。

会话是数据库连接。作用域是当前查询或当前存储过程。

如果表上有触发器,则会出现scope_identity()@@identity函数不同的情况。如果您有一个插入记录的查询,导致触发器在某处插入另一条记录,则scope_identity()函数将返回查询创建的标识,而@@identity函数将返回触发器创建的标识。

因此,通常您将使用scope_identity()函数。

票数 482
EN

Stack Overflow用户

发布于 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()

票数 50
EN

Stack Overflow用户

发布于 2011-10-11 14:28:48

如果您了解scope和session之间的区别,那么理解这些方法将非常容易。

Adam Anderson的一篇非常好的blog post描述了这种差异:

Session是指正在执行该命令的当前连接。

Scope指的是命令的直接上下文。每个存储过程调用都在其自己的作用域中执行,而嵌套调用则在调用过程的作用域内的嵌套作用域中执行。同样,从应用程序或SSMS执行的SQL命令在其自己的作用域中执行,如果该命令触发任何触发器,则每个触发器都在其自己的嵌套作用域中执行。

因此,这三种身份检索方法之间的区别如下:

@@identity返回在此会话中生成的最后一个标识值,但不返回任何范围。

scope_identity()返回在此会话和此作用域中生成的最后一个标识值。

ident_current()返回在任何会话和任何作用域中为特定表生成的最后一个标识值。

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1920558

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档