2011-12-29 7 views
5

Załóżmy, że mam tysiące wierszy do zaktualizowania.Jak utworzyć pętlę na instrukcji UPDATE, która działa, dopóki nie zostanie żaden wiersz do aktualizacji?

I planuję aktualizować iteracyjnie; poprzez aktualizację tylko 1000 wierszy na iterację.

I chcę iterować, dopóki nie będzie żadnych wierszy do aktualizacji.

Jak mogę uruchomić skrypt T-SQL poniżej, dopóki nie będzie żadnego wiersza do aktualizacji?

-- TODO: Create a loop so that it exists when there is no ROW left to be updated; 
-- how can I do it? 

UPDATE tableToUpdate 
SET IsVegetable = 1 
WHERE Id IN 
       (SELECT TOP 1000 Id 
       FROM tableToUpdate 
       WHERE Date = '2011-07-23 14:00') 

-- Loop ends 
+1

Dlaczego chcesz aktualizować tylko 1000 maks. Za każdym razem? Wydaje mi się, że usunięcie klauzuli WHERE rozwiązałoby twój problem. Ale konkretnie mówisz, że chcesz to robić 1000 razy tylko zastanawiam się, dlaczego? – Ruben

+1

Podałem liczby jako przykład, ale powodem jest to, aby zapobiec przekroczeniu limitu czasu transakcji. Drugi powód to: Ciekawość implementacji. – pencilCake

Odpowiedz

7

Spróbuj pętlę

while 1 = 1 
BEGIN 
    UPDATE top (1000) tableToUpdate 
    SET IsVegetable = 1 
    WHERE 
     Date = '2011-07-23 14:00' 
    AND IsNull(IsVegetable, 0) = 0 

    if @@ROWCOUNT < 1000 BREAK 
END 

Dlaczego ISNULL - ponieważ nie jest jasne - jeśli IsVegetable pole jest pustych lub nie, jeśli nie - wtedy ISNULL nie potrzebne

Kiedy nie pozostanie żaden wiersz z IsVegetable <> 1 - pętla zostanie zamknięta, ponieważ @@ ROWCOUNT będzie = 0 lub < 1000 (dla ostatniej iteracji)

+0

Czy możesz wyjaśnić, dlaczego tego potrzebujesz: AND IsNull (IsVegetable, 0) = 0 – pencilCake

+0

Czy możesz wyjaśnić mechanizm, który zapewnia, że ​​pętla zadziała, dopóki nie zostanie 0 wierszy? – pencilCake

+0

Dodano do odpowiedzi. –