Попробуйте это, используйте начальное и конечное значения и приращение его в партиях
DECLARE @Batch INT
,@StartId BIGINT
,@EndId BIGINT
,@r INT
SELECT @Batch = 10000
,@StartId = 1
,@EndId = 0
,@r = 1
WHILE @r > 0
BEGIN
SET @StartId = @EndId + 1
SET @EndId = @EndId + @Batch
UPDATE d
SET col = dd.col
FROM doc.Document d
INNER JOIN @documents dd ON d.id = dd.id
AND dd.id BETWEEN @StartId AND @EndId
SET @r = @@ROWCOUNT
END
выше подхода к работе только тогда, когда у вас есть идентификаторы в последовательности, в противном случае использовать этот подход, чтобы заранее сформировать партии и использовать его, это гарантирует, что каждый раз запись 10000 будет обновлена.
DECLARE @Batch INT
,@StartId BIGINT
,@EndId BIGINT
,@Cnt INT
,@TotalIds INT
DECLARE @Docs TABLE
(
StartId BIGINT,
EndId BIGINT,
BatchID INT
)
SELECT @Batch = 10000
,@StartId = 1
,@EndId = 0
,@Cnt = 1
,@TotalIds = 0
;WITH CTE_Docs AS
( SELECT TOP (100) PERCENT id, ROW_NUMBER() OVER (ORDER BY id) as RowID -- Give seq numbers to each row
FROM @documentIds d
)
-- create batches and batch start and end point
INSERT INTO @Docs(StartId, EndId, BatchId)
SELECT MIN(id) StartID,
MAX(id) EndID,
(RowID/@Batch)+1 AS BatchID
FROM CTE_Docs
GROUP BY RowID/@Batch
ORDER BY BatchID
-- get counter to loop through
SELECT @TotalIds = MAX(BatchID)
FROM @Docs
WHILE @Cnt <= @TotalIds BEGIN
SELECT @StartID = StartID,
@EndID = EndID
FROM @Docs
WHERE BatchID = @Cnt
UPDATE d
SET col = dd.col
FROM doc.Document d
INNER JOIN @documents dd ON d.id = dd.id
AND dd.id BETWEEN @StartId AND @EndId
SET @Cnt = @Cnt + 1
END
Надеюсь, это поможет.
http://stackoverflow.com/q/1198364/1080354 – gotqn