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
1 ping
MKsOrb.Com
2021-08-03 at 18:42 (UTC 1) Link to this comment
MKsOrb.Com
[...]although web-sites we backlink to below are considerably not associated to ours, we really feel they may be really really worth a go by way of, so have a look[...]