A to vadí? Tak si do temp tabulky vyberte řekněme každý 50000 primární klíč a ještě ten nejnižší, který se tam vyskytuje:
CREATE TABLE #t (id UNIQUEIDENTIFIER PRIMARY KEY)
INSERT INTO #t
SELECT id FROM (
SELECT id, ROW_NUMBER() OVER (ORDER BY id) as rn FROM tabulka
) t WHERE rn MOD 50000 = 0
INSERT INTO #t
SELECT MIN(id) FROM tabulka
A pak ve while cyklu dělejte ten update:
DECLARE @lastId UNIQUEIDENTIFIER
WHILE ((SELECT COUNT(*) FROM #t) > 0) BEGIN
SELECT @lastId = MAX(id) FROM #t
UPDATE tabulka SET ...
WHERE id >= @lastId
-- tady vysypat transakční log
DELETE FROM #t WHERE id = @lastId
END
Píšu to z hlavy, takže tam budou chyby, asi by to šlo i bez té temp tabulky, ale musel byste hlídat, jestli jste zupdatoval všechno. Nebude to celé ale transakční, pokud vám někdo přidá záznam do intervalu, který jste již updatoval, máte smůlu. Ale celé to dát do transakce nejde - to bychom měli ten samý problém jako na začátku - malý transakční log.
|