首页 >数据库 >mysql教程 >SQL Server 中的'@@IDENTITY”、'SCOPE_IDENTITY()”、'IDENT_CURRENT()”和'IDENTITY()”有什么区别?

SQL Server 中的'@@IDENTITY”、'SCOPE_IDENTITY()”、'IDENT_CURRENT()”和'IDENTITY()”有什么区别?

Linda Hamilton
Linda Hamilton原创
2025-01-20 13:04:11905浏览

What's the Difference Between `@@IDENTITY`, `SCOPE_IDENTITY()`, `IDENT_CURRENT()`, and `IDENTITY()` in SQL Server?

SQL Server 标识函数:详细比较

@@IDENTITYSCOPE_IDENTITY()IDENT_CURRENT()IDENTITY() 都与从 SQL Server 中的标识列检索值相关,但它们在范围和应用程序上存在显着差异。

了解 SQL Server 标识函数中的范围

“范围”是指生成身份值的上下文。 这可以是:

  • 会话范围:当前数据库连接。
  • 查询/存储过程范围:查询或存储过程的当前执行块。

功能分解

  • @@IDENTITY: 返回在 当前会话 中生成的最后一个标识值,无论范围如何(查询、存储过程或触发器)。

  • SCOPE_IDENTITY(): 返回在当前会话和范围内生成的最后一个身份值。这是最常推荐的功能,因为它提供更精确的结果。

  • IDENT_CURRENT('table_name'): 返回为特定表生成的最后一个标识值,无论会话或范围如何。 当您需要跨不同会话或上下文的特定表的最后一个标识值时,这非常有用。

  • IDENTITY(): 这是用于检索身份值。 它是使用 SELECT ... INTO 语法创建表时用于定义标识列的关键字。

说明性场景

让我们检查不同的场景以突出差异:

  • 单个 INSERT 语句: 如果单个 INSERT 语句添加一行,SCOPE_IDENTITY()@@IDENTITY 将返回相同的值。

  • 基于触发器的插入: 如果触发器在将 INSERT 插入第一个表后将行插入到第二个表中,SCOPE_IDENTITY() 将返回受当前语句直接影响的表的标识(第一个表),而 @@IDENTITY 将返回会话中最后受影响的表(可能是第二个表)的身份。

选择正确的功能

对于大多数情况,SCOPE_IDENTITY() 是首选,因为它提供特定于上下文的结果。 当您需要最新的身份值(无论其在会话中的来源如何)时,@@IDENTITY 非常有用。当您需要特定表的最后一个标识值(无论当前会话如何)时,IDENT_CURRENT() 至关重要。 请记住,IDENTITY() 用于定义标识列,而不是检索它们的值。

以上是SQL Server 中的'@@IDENTITY”、'SCOPE_IDENTITY()”、'IDENT_CURRENT()”和'IDENTITY()”有什么区别?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn