深入理解SQL Server中的@@IDENTITY
, SCOPE_IDENTITY()
, IDENT_CURRENT()
和IDENTITY()
函数
在SQL数据库编程中,获取最后插入的标识值是一项关键任务。为此,提供了多种函数,每个函数都有其细微差别。SCOPE_IDENTITY()
、IDENTITY()
、@@IDENTITY
和IDENT_CURRENT()
是最常用的几个函数,但它们之间的区别可能令人困惑。
理解作用域
理解“作用域”的概念是理解这些函数之间差异的关键。在SQL中,作用域指的是查询或代码块执行的级别。存在两个主要作用域:
函数差异
基于作用域和功能,以下是每个函数的细分:
@@IDENTITY
:返回在同一会话中创建的最后一个标识值。此函数不依赖于查询或存储过程的作用域,通常用于全局标识值的检索。SCOPE_IDENTITY()
:返回在同一会话和作用域中创建的最后一个标识值。与@@IDENTITY
不同,此函数只考虑当前查询或存储过程的上下文。IDENT_CURRENT(name)
:返回为特定表或视图创建的最后一个标识值,而不管会话或查询作用域如何。此函数可用于检索不同查询和会话中的标识值。IDENTITY()
:与其他三个函数不同,IDENTITY()
主要用于在SELECT...INTO
查询中生成标识值。它不检索现有的标识值。使用场景
为了说明这些差异,请考虑以下场景:
@@IDENTITY
检索它。<code class="language-sql">INSERT INTO MyTable (Name) OUTPUT INSERTED.ID INTO @Identity; PRINT @Identity; -- 打印全局插入的标识值</code>
MyTable
上创建一个触发器,以在另一个表中插入记录,并从两个表中检索标识值。<code class="language-sql">CREATE TRIGGER MyTrigger ON MyTable AFTER INSERT AS INSERT INTO OtherTable (Name) VALUES (NEW.Name); INSERT INTO MyTable (Name) VALUES ('Test'); SELECT @@identity AS MyIdentity; -- 打印在MyTable中插入的标识值 SELECT scope_identity() AS TriggerIdentity; -- 打印触发器在OtherTable中插入的标识值</code>
在这些场景中,@@IDENTITY
和SCOPE_IDENTITY()
由于触发器的参与而表现出不同的行为。
最佳实践建议
在大多数情况下,SCOPE_IDENTITY()
是检索创建的最后一个标识值的推荐函数。它在当前查询或存储过程中提供最可靠和上下文相关的数值。但是,如果您需要检索不同作用域或会话中的标识值,IDENT_CURRENT(name)
提供了该功能。
以上是SQL Server 中的'@@IDENTITY”、'SCOPE_IDENTITY()”、'IDENT_CURRENT()”和'IDENTITY()”之间有什么区别?的详细内容。更多信息请关注PHP中文网其他相关文章!