SQL Server курсор застрял в цикле - PullRequest
0 голосов
/ 21 июня 2011

Хорошо, я в полном недоумении - этот бит кода работал, а теперь вдруг не работает ...

    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:

Я удалил много вещей и добавил это правопосле оператора 'объявлять курсор', чтобы увидеть, могу ли я вывести НИЧЕГО ...


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

Все еще зависает ... так что я вынул "оператор извлечения", и он, кажется, больше не зависает,Очевидно, он ничего не делал, потому что я ничего не делал, но завершил выполнение.

Что заставляет меня задуматься о том, почему оператор fetch зависает.Существуют ли какие-либо настройки сервера, которые могут повлиять на это?Некоторые проблемы с памятью?Аппаратные проблемы?

Ответы [ 2 ]

3 голосов
/ 21 июня 2011

Есть ли причина, по которой курсор так структурирован?

Обычно курсоры строятся так:

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;

Всякий раз, когда они застряли во взгляде, это будет связано с тем, что статус извлечения не был установлен равным нулю (для меня это обычная причина, пропускает "извлекать следующий").

-

EDIT: Можете ли вы проверить в мониторе активности и посмотреть, работает ли этот кусок SQL? Есть ли тупик?

0 голосов
/ 21 июня 2011

Я думаю, @@ fetch_status возвращает что-то отличное от 0, например, -1 или -2

Ссылка MSDN

Может быть, проверьте, что именнотам;это должно дать вам подсказку о том, что не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...