sql - 执行不同的存储过程后使用范围标识设置变量
问题描述
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();
解决方案
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;
推荐阅读
- java - 将面板放入面板 java GUI
- exception - 在 Raspberry Pi 上使用 w1thermsensor 处理错误
- terraform - Terraform:在 aws_autoscaling_schedule 资源中传递自动缩放组名称时出错
- bash - 计算哈希对象中的错误,内容为“1”字符?
- javascript - 宏任务队列和微任务队列优先级
- javascript - 在while循环中选择HTML
- python-3.x - pyqt5 广泛使用的多线程或并发处理?
- coldfusion - 图像写入时 Lucee 的问题
- r - (MANOVA.RM) RM 返回错误:找不到主题变量
- reactjs - 通过删除 map 函数进行一次性 API 调用