Проблема с курсором SQL Server 2000, не получающим NEXT - PullRequest
3 голосов
/ 16 сентября 2011

У меня есть SQL Server 2000 дБ.Мне нужно запустить следующий курсор, чтобы запустить триггер для отдельных записей (триггер будет работать только с одной записью за раз).

DECLARE @REC as bigint

DECLARE coil1_cursor CURSOR FOR
SELECT Rec# FROM coil1 WHERE Timestamp BETWEEN '2011-05-10 06:00:00' AND '2011-05-10 07:00:00'

OPEN coil1_cursor
FETCH NEXT FROM coil1_cursor INTO @REC

WHILE (@@FETCH_STATUS=0)
BEGIN
    Print @Rec
    UPDATE coil1 SET ShiftLength=Null WHERE Rec#=@REC

    FETCH NEXT FROM coil1_cursor INTO @REC
END
CLOSE coil1_cursor
DEALLOCATE coil1_cursor

Если я закомментирую строку UPDATE, я получу последовательные числа отПоле Rec #, как и ожидалось.Если я раскомментирую строку UPDATE, пакет перейдет в бесконечный цикл.Когда я останавливаю пакет, он показывает обновление только первой полученной записи.Это как FETCH NEXT застревает.Есть идеи почему?

Ответы [ 2 ]

5 голосов
/ 16 сентября 2011

Вы используете параметры курсора по умолчанию (включая динамический).Попробуйте использовать гораздо более эффективный курсор для ваших целей:

DECLARE coil1_cursor CURSOR LOCAL STATIC FORWARD_ONLY READ_ONLY
FOR ...

Но для реального исправления Джо абсолютно прав - это вовсе не должен быть курсор.Вы можете сделать то же самое с помощью одного оператора обновления.Нет курсора, нет бесконечных циклов, нет ожидания:

UPDATE coil1 
   SET ShiftLength = NULL
   WHERE [Timestamp] BETWEEN '2011-05-10 06:00:00' AND '2011-05-10 07:00:00'

(Кроме того, [Timestamp] - ужасное имя столбца, поскольку оно представляет тип данных, который не имеет ничего общего с датой или временем. Rec# тоже не сказочный. YMMV.)

2 голосов
/ 16 сентября 2011

Поскольку вы обновляете таблицу, на которую ссылается курсор, вы должны объявить курсор как STATIC.

DECLARE coil1_cursor CURSOR STATIC FOR
SELECT Rec# FROM coil1 WHERE Timestamp BETWEEN '2011-05-10 06:00:00' AND '2011-05-10 07:00:00'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...