此表中有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
答案 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将返回零,并且循环将结束。