sql server游标卡在循环中

时间:2011-06-20 22:03:37

标签: sql sql-server sql-server-2008 tsql database-cursor

好吧,我完全不知所措 - 这段代码曾经工作过,现在突然间没有......

    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语句挂起的原因。是否有一些服务器设置可能会影响这个?一些记忆问题?硬件问题?

2 个答案:

答案 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)

我的猜测是,@@ fetch_status返回0以外的其他内容,例如-1或-2

MSDN Link

也许检查一下那里究竟是什么;这应该能给你一些关于错误的线索。