0

わかりました、私は完全に途方に暮れています-このコードのビットは以前は機能していましたが、今は突然機能しなくなりました...。

    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ステートメントをコメントアウトし、printステートメントを挿入しましたが、続行します。「stepcompleted」printステートメントが出力され、「enteringcursor」ステートメントも出力されます。そして、何も....ただハングします。クエリ自体は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:

私はたくさんのものを取り除き、「カーソルの宣言」ステートメントの直後にこれを追加して、何かを出力できるかどうかを確認しました...


RAISERROR ('query done', 0, 1) WITH NOWAIT 
open GetAllCodes 
fetch next from GetAllCodes into @activationCodePKID  
close GetAllCodes 
deallocate GetAllCodes 

まだハングしています...それで、「fetchステートメント」を取り出しましたが、もうハングしていないようです。何もしていないので、明らかに何もしませんでしたが、実行は完了しました。

これにより、fetchステートメントがハングしている理由を考えることができます。これに影響を与える可能性のあるサーバー設定はありますか?いくつかのメモリの問題?ハードウェアの問題?

4

2 に答える 2

4

カーソルがそのように構成されている理由はありますか?

通常、カーソルは次のように作成されます。

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;

フェッチ ステータスが 0 に設定されていないことが原因で、ルックに行き詰まることがあります (私の通常の原因は、「次のフェッチ」がないことです)。

--

編集: アクティビティ モニターをチェックインして、その SQL が実行されているかどうかを確認できますか? デッドロックはありますか?

于 2011-06-20T22:12:24.427 に答える
0

私の推測では、@@fetch_status は 0 以外の値を返しています (例: -1 または -2)。

MSDN リンク

そこに正確に何が入っているかを確認してください。それは何が間違っているかについての手がかりを与えるはずです。

于 2011-06-20T22:11:48.160 に答える