尝试更新循环中的行

时间:2019-08-19 15:00:17

标签: sql-server

此表中有380万行,我无法运行我的更新语句。我相信我需要一次遍历一小部分行来完成此操作,但是我不熟悉如何以这种方式遍历数据集。

UPDATE dbo.table
SET collectedtime = DateUpdated
WHERE collectedtime IS NULL;

将其更新为游标,它将运行,但我必须分批执行500k:

DECLARE @Datatoupdate BIGINT
DECLARE @Cursor CURSOR
DECLARE @Data TABLE
(
    Id BIGINT
)

INSERT INTO @Data
(
    Id
)
(SELECT TOP 500000 Raw_ID FROM dbo.table NOLOCK
WHERE collectedtime IS NULL )  -- Id - bigint

SET @Cursor = CURSOR FOR
SELECT Id FROM @Data;

OPEN @Cursor;
FETCH NEXT FROM @Cursor INTO @Datatoupdate

WHILE @@FETCH_STATUS = 0
BEGIN
    SET NOCOUNT ON
    BEGIN

        UPDATE dbo.table
        SET CollectedTime = DateUpdated
        WHERE Raw_Id = @Datatoupdate;
    END

    FETCH NEXT FROM @Cursor INTO @Datatoupdate;
END

Rollback

2 个答案:

答案 0 :(得分:0)

您从正确的路径开始,将批处理语句分成较小的组,但随后又转向逐个处理数据,而不是一次运行较大的批处理。这是我处理这种情况的一种方法:

null

答案 1 :(得分:0)

通用方法是这样做的:

declare @still_there_are_rows int = 1
while @still_there_are_rows > 0
begin
    -- update 1000 rows at a time
    update top (1000) table1 
    set field1 = 1
    where field1 <> 1

    set @still_there_are_rows = (select @@ROWCOUNT)
end

没有更多行要更新时,@@ ROWCOUNT将返回零,并且循环将结束。