j_m*_*aly 5 sql t-sql sql-server
我对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
Run Code Online (Sandbox Code Playgroud)
哪个回报
SCOPE_IDENTITY
21
@@IDENTITY
21
Run Code Online (Sandbox Code Playgroud)
从文档中我会认为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()
Run Code Online (Sandbox Code Playgroud)