Основной синтаксис для курсора FOR UPDATE - PullRequest
1 голос
/ 22 декабря 2010

Хорошо, я, конечно, знаком с обходом таблицы с использованием курсора только для чтения, но не могу найти правильный синтаксис для обновления текущей строки (ни для страница курсора или страница ОБНОВЛЕНИЕ в книгах в Интернете, кажется, показывают эту простую операцию):

DECLARE @counter int;
SET @counter = 1;
DECLARE myCursor CURSOR FOR
        SELECT RowID, Value FROM myTable
        FOR UPDATE OF Value;
OPEN myCursor;
WHILE @counter < 100
    FETCH NEXT FROM myCursor
    UPDATE myCursor SET Value = @Counter << DOESN'T WORK 
    SET @counter = @counter + 1
END
CLOSE myCursor
DEALLOCATE myCursor

Я также попробовал просто SET Value = @Counter и использовал INTO @Value на FETCH, но, похоже, не смог заставить это работать.

Это явно слишком упрощенно, есть гораздо более эффективные способы просто "отсчитать" столбец. Я не буду утомлять вас фактическим расчетом.

Да, мне нужен курсор, а не ОБНОВЛЕНИЕ для всей таблицы (значение для каждой последующей строки будет основано на расчете, который зависит от уже записанной предыдущей строки).

Первоначально проверялось это на SQL 2005, но мне также нужно будет перенести код на SQL 2000 и 2008. Спасибо!

1 Ответ

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

Вы хотите использовать WHERE CURRENT OF -

DECLARE complex_cursor CURSOR FOR
    SELECT a.BusinessEntityID
    FROM HumanResources.EmployeePayHistory AS a
    WHERE RateChangeDate <> 
         (SELECT MAX(RateChangeDate)
          FROM HumanResources.EmployeePayHistory AS b
          WHERE a.BusinessEntityID = b.BusinessEntityID) ;
OPEN complex_cursor;
FETCH FROM complex_cursor;
UPDATE HumanResources.EmployeePayHistory
SET PayFrequency = 2 
WHERE CURRENT OF complex_cursor;
CLOSE complex_cursor;
DEALLOCATE complex_cursor;
GO

То есть от MSDN .

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