2011-12-29 11 views
5

Supongamos que tengo miles de filas para actualizar.¿Cómo puedo crear un ciclo en una instrucción UPDATE que funciona hasta que no quede ninguna fila para actualizar?

Y planeo hacer la actualización de forma iterativa; al actualizar solo 1000 filas por iteración.

Y quiero repetir hasta que no queden filas para actualizar.

¿Cómo puedo ejecutar el script T-SQL a continuación hasta que no haya una fila para actualizar?

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

¿Por qué quiere actualizar solo 1000 max cada vez? Para mí, parece que eliminar la cláusula WHERE resolvería su problema. Pero específicamente dices que quieres hacerlo 1000 veces, ¿me pregunto por qué? – Ruben

+1

Di los números como un ejemplo, pero la razón es para evitar tiempos de espera de transacción. Y la razón secundaria es: Curiosidad en la implementación. – pencilCake

Respuesta

7

Pruebe este bucle

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 

Por qué ISNULL - porque no es clara - si el IsVegetable campo es anulable o no, si no - entonces ISNULL no es necesario

Cuando no queden filas con IsVegetable <> 1, el ciclo se cerrará porque @@ ROWCOUNT será = 0 o < 1000 (para la última iteración)

+0

¿Puedes explicarme por qué lo necesitas? AND IsNull (IsVegetable, 0) = 0 – pencilCake

+0

¿Y puedes explicar el mecanismo que garantiza que el ciclo funcionará hasta que queden 0 filas? – pencilCake

+0

Agregado a la respuesta. –

Cuestiones relacionadas