好吧,我完全不知所措 - 这段代码曾经工作过,现在突然间没有......
declare GetAllCodes cursor local for
select ac.activationCodePKID from ActivationCodes ac
left join OrdersLineItems od on ac.activationCodePKID = od.activationCodePKID
where od.activationCodePKID is null and ac.internalorderPKID is not null
and ac.campaignID is not null
and ac.enteredBy like 'ProcessRequest|Entitlement%'
RAISERROR ('step completed', 0, 1) WITH NOWAIT
open GetAllCodes
while (1=1)
begin
RAISERROR ('entering cursor', 0, 1) WITH NOWAIT
fetch next from GetAllCodes into @activationCodePKID
if (@@fetch_status <> 0)
begin
DEALLOCATE GetAllCodes
break
end
exec fixOrder @activationCodePKID, 6, 7
end
它似乎只是陷入了一个循环...我已经注释掉了exec语句,只是输入了一个打印声明,但它只是继续下去。 “步骤完成”打印语句被打印,“输入游标”语句也是如此。什么都没有....只是挂起。查询本身返回192行,所以要循环,它应该循环超过192次然后分解和结束。想法?
修改
我补充说:
declare @var varchar(10)
set @var = 'here: ' + cast(@@fetch_status as varchar(10))
RAISERROR (@var, 0, 1) WITH NOWAIT
......在fetch next from GetAllCodes into @activationCodePKID
陈述之后 - 仍然没有。 “进入光标”仍然会被打印,但它只是挂起......
编辑2:
我删除了很多东西,并在'declare cursor'语句后添加了这个,看看我是否可以输出任何东西......
RAISERROR ('query done', 0, 1) WITH NOWAIT
open GetAllCodes
fetch next from GetAllCodes into @activationCodePKID
close GetAllCodes
deallocate GetAllCodes
仍然挂起......所以我拿出了'fetch statement',它似乎不再挂了。显然,它没有做任何事情,因为我没有做任何事情,但它完成了执行。
这让我想到fetch语句挂起的原因。是否有一些服务器设置可能会影响这个?一些记忆问题?硬件问题?
答案 0 :(得分:3)
光标的结构是否有原因?
通常游标的构建方式如下:
declare @dbName varchar(max);
declare myCursor cursor for select [name] from sys.databases;
open myCursor;
fetch next from myCursor into @dbName;
while (@@fetch_status = 0)
begin
print @dbName;
fetch next from myCursor into @dbName;
end;
close myCursor;
deallocate myCursor;
每当他们陷入困境时,因为获取状态未设置为零(通常原因是我,错过了“fetch next”)。
-
编辑: 你可以检查活动监视器,看看这块SQL是否正在运行?有僵局吗?
答案 1 :(得分:0)