2011-12-29 7 views
5

私は更新するために何千もの行があると仮定します。更新が必要な行がなくなるまで動作するUPDATE文にループを作成するにはどうすればよいですか?

私は更新を繰り返し行う予定です。 1回の繰り返しにつき1000行だけを更新します。

更新が残っていない行がなくなるまで繰り返したいと思います。

更新する行がなくなるまで、以下のT-SQLスクリプトを実行するにはどうすればよいですか?

-- 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

毎回1000回更新するのはなぜですか?私にとっては、WHERE句を削除すると問題が解決するようです。しかし、あなたは具体的に言うと、あなたはそれを1000時間にしたいと思っています。 – Ruben

+1

例として数字を挙げましたが、理由はトランザクションのタイムアウトを防ぐためです。そして二次的な理由は:実装上の好奇心。 – pencilCake

答えて

7

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 

なぜISNULLこのループを試してみてください - それは明確ではないので - そしてISNULL

を必要としない - いない場合は、フィールドIsVegetableは、NULL可能であるかどうかIsVegetable <> 1の行が残っていない場合、@@ ROWCOUNTが0または<(最終反復の場合)のためループが終了します

+0

なぜあなたはこれを必要としたのか説明できますか?そしてIsNull(IsVegetable、0)= 0 – pencilCake

+0

そして、0行が残るまでループが確実に機能するようにするメカニズムを説明できますか? – pencilCake

+0

答えに追加されました。 –

関連する問題