«

Jan 08

Aktualizowanie rekordów w pętli while – TSQL

Poniżej przykład aktualizowania dużej liczby rekordów z wykorzystaniem pętli WHILE w TSQL

Dlaczego tak? Dlatego, że chcemy podzielić rekordy na paczki i aktualizować paczka po paczce. W przypadku błędu wycofana zostanie jedna paczka a nie całość.

Przykład na podstawie bazy AdventureWorks2008R2

SELECT COUNT(*) FROM Production.Product WHERE FinishedGoodsFlag = 1

Wynik zapytania 295 rekordów

DECLARE @isFinished BIT
DECLARE @packageSize INT
SET @isFinished = 0
SET @packageSize = 50

WHILE @isFinished = 0 
    BEGIN
        UPDATE TOP ( @packageSize ) Production.Product
            SET     FinishedGoodsFlag = 0
        WHERE FinishedGoodsFlag = 1
        
        IF ( @@ROWCOUNT < @packageSize ) 
        BEGIN
            SET @isFinished = 1
        END
    END

Wynik zapytania:

(50 row(s) affected)

(50 row(s) affected)

(50 row(s) affected)

(50 row(s) affected)

(50 row(s) affected)

(45 row(s) affected)

Należy zwrócić szczególną uwagę na warunek wyjścia z pętli WHILE w połączeniu z warunkiem WHERE w wyrażeniu UPDATE. Jeśli nie dodamy klauzuli WHERE z odpowiednim warunkiem, możemy uruchomić pętlę, która nigdy się nie skończy . W powyższym przykłądzie aktualizowalibyśmy pierwsze 50 rekordów z tabeli Production.Product