首页 > 解决方案 > 执行不同的存储过程后使用范围标识设置变量

问题描述

INSERT在首先将另一个存储过程用于“案例”之后,我试图在存储过程中设置声明的变量。

伪代码如下所示:

DECLARE @CaseId variable
INSERT Case into Case table
SET @CaseId using SCOPE_IDENTITY

IF Case.CaseID = @CaseId
--rest of script

下面的脚本按我的预期工作:

INSERT INTO Case (CaseRef, [Source], DateCreated, CaseType)
VALUES (@caseRef, @source, @dateCreated, @caseType)
SET @caseID = SCOPE_IDENTITY();

我已经尝试使用下面的脚本,但它似乎没有设置变量。这可能吗?或者我必须按照上面脚本中的方式设置它吗?

EXEC sp_InsertCase @caseRef, @source, @dateCreated, @caseType
SET @caseID = SCOPE_IDENTITY();

标签: sqlsql-servertsql

解决方案


scope_identity()做它在锡上所说的 - 它为您提供当前范围内生成的最后一个标识值。存储过程定义了一个范围。因此,当导致生成标识值的存储过程退出时,您不再处于生成该值的范围内,因此scope_identity()无法告诉您任何信息。

您可以做的是将scope_identity()值捕获到存储过程中的变量中,并将其作为输出参数返回:

create table t(i int identity(1,1), j int);
go
create proc insert_and_get_scope @scopeid int = null output as
begin
   insert t(j) values (1);
   set @scopeid = scope_identity();
end
go

declare @scopeid int;
exec insert_and_get_scope @scopeid output;
select @scopeid;

推荐阅读