Я использую курсор UPDATE для SQL 2005 следующим образом:
DECLARE myCursor CURSOR FOR
SELECT RowID, Value FROM myTable
FOR UPDATE OF Value;
OPEN myCursor;
FETCH NEXT FROM myCursor
WHILE (@@FETCH_STATUS <> -1)
UPDATE myTable SET Value = 42
WHERE CURRENT OF myCursor
FETCH NEXT FROM myCursor
END
CLOSE myCursor
DEALLOCATE myCursor
(Спасибо Мэтту за правильный ответ на мой предыдущий вопрос относительно этого синтаксиса курсора. И даМне нужен курсор, потому что новое значение каждой строки на самом деле основано на сложном вычислении, которое зависит от предыдущих строк.)
Это работает правильно, обновляя все значения.Проблема состоит в том, что он возвращает набор результатов для каждой обновленной строки, состоящий из RowID, Value (интересно, что он показывает результат от до строки обновленной).В итоге я получаю следующую ошибку:
В запросе превышено максимальное количество наборов результатов, которые могут отображаться в таблице результатов.В таблице отображаются только первые 100 наборов результатов.
Есть ли способ подавить эти наборы результатов?SET NOCOUNT ON
не делает трюк.Это просто проблема, которую я вижу при запуске прямо в SSMS?Или он действительно попытается вернуть сотни наборов результатов, когда я помещу этот курсор в сохраненный процесс?
РЕДАКТИРОВАТЬ: похоже, он не имеет ничего общего с ОБНОВЛЕНИЕМ.
Используя FETCH NEXT FROM myCURSOR
так, как я на самом деле возвращаю набор результатов следующей строки из курсора.
Если я изменю его на FETCH NEXT FROM myCURSOR INTO @variables
, тогда он не вернет набор результатов.
Итак, я предполагаю, что вопрос теперь таков: так как я использую WHERE CURRENT OF
, мне действительно не нужна переменная.Думаю, я могу вставить их просто для подавления результирующего набора, но есть ли лучший способ сделать это?