Курсор FOR UPDATE возвращает набор результатов для каждой строки! - PullRequest
2 голосов
/ 22 декабря 2010

Я использую курсор 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, мне действительно не нужна переменная.Думаю, я могу вставить их просто для подавления результирующего набора, но есть ли лучший способ сделать это?

1 Ответ

2 голосов
/ 22 декабря 2010

Обратите внимание, в то время как начало ... конец и выборка в

Declare @row int
Declare @value int
DECLARE myCursor CURSOR FOR
        SELECT RowID, Value FROM myTable
        FOR UPDATE OF Value;
OPEN myCursor;
FETCH NEXT FROM myCursor into @row, @value
WHILE (@@FETCH_STATUS <> 1)
begin   
    UPDATE myTable SET Value = 42
    WHERE CURRENT OF myCursor
    FETCH NEXT FROM myCursor into @row, @value
END
CLOSE myCursor
DEALLOCATE myCursor
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...