繁体   English   中英

由SCOPE_IDENTITY()和GO混淆

[英]Confused by SCOPE_IDENTITY() and GO

我对SQL Server中SCOPE_IDENTITY()的文档和行为感到有点困惑。

这个页面https://docs.microsoft.com/en-us/sql/t-sql/functions/scope-identity-transact-sql?view=sql-server-2017说这个关于SCOPE_IDENTITY():

返回插入同一范围内的标识列的最后一个标识值。 范围是一个模块:存储过程,触发器,函数或批处理 因此,如果两个语句在同一存储过程,函数或批处理中,则它们在同一范围内。

它包含这个例子

USE AdventureWorks2012;  
GO  
INSERT INTO Person.ContactType ([Name]) VALUES ('Assistant to the Manager');  
GO  
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];  
GO  
SELECT @@IDENTITY AS [@@IDENTITY];  
GO  

哪个回报

SCOPE_IDENTITY  
21  
@@IDENTITY  
21

从文档中我会认为SCOPE_IDENTITY()的结果将为NULL,因为SELECT SCOPE_IDENTITY()AS [SCOPE_IDENTITY]; 是在一个不同的批处理中执行(因为它在GO之后)而不是INSERT命令...我在这里缺少什么?

我同意,我认为文档有点误导。 SCOPE_IDENTITY确保在同一连接上直接执行的多个批次保留其值。

但需要注意的是,如果你创建一个内部批次,通过执行EXEC用字符串,内部批次的SCOPE_IDENTITY是独立于你的外批的SCOPE_IDENTITY


此脚本生成值2 ,而不是5

create table T1 (ID int IDENTITY(2,1000) not null,Val char(1))
create table T2 (ID int IDENTITY(5,1000) not null, Val char(1))
go
insert into T1(Val) values ('a')
exec('insert into T2(Val) values (''b'')')
select SCOPE_IDENTITY()

不要使用scope_indentity SQL Server有一种更好的方法从插入返回值OUTPUT子句。

DECLARE @ids TABLE (id INT);

INSERT INTO Person.ContactType ([Name])
    OUTPUT inserted.ID INTO @ids  -- I'm not sure what the identity is named
    VALUES ('Assistant to the Manager');

这有多个优点:

  • 您可以返回比id更多的列。
  • 您可以从具有多行的插入返回ID。
  • 您根本不必担心确定范围。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM