问题描述
数据表有几千万数据,需要就其中约百万数据进行更新,不能锁表。因此采用游标进行更新。
解决方案
-- 声明变量用以存储游标获得的数据
DECLARE @Id INT;
-- 声明游标
DECLARE IdCursor CURSOR FOR(SELECT id FROM my_table WHERE state = -2 ) FOR UPDATE OF state;
-- 打开游标
OPEN IdCursor;
-- 移动游标,加载数据
FETCH NEXT FROM IdCursor
INTO @Id;
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE my_table SET state=-1 WHERE id = @Id;
-- 移动游标到下一条数据
FETCH NEXT FROM IdCursor
INTO @Id;
END;
CLOSE IdCursor;
DEALLOCATE IdCursor;