2009-10-03 17 views
28

que estoy tratando de averiguar cómo implementar esto en TSQLCómo implementar un bucle do-while en tsql

do 
    update stuff set col = 'blah' where that_row = 'the right one' 
    select trash from stuff ... 
until some_condition 

La única frase flujo de control iterativo proporcionada por Transact-SQL es while (condition) sentences que primero evalúa la condición y si esa condición es verdadera, entonces ejecuta la oración.

Estoy pensando en un escenario como ejecutar una instrucción UPDATE sobre una tabla hasta que se active alguna condición y se logre la última ACTUALIZACIÓN ejecutada.

más importante, estoy buscando el enfoque menos sucia a este problema (Duplicación de la actualización antes de la MIENTRAS no tiene mucho sentido para mí como la sentencia ACTUALIZACIÓN puede ser arbitrariamente larga y compleja)


EDIT: El problema que estoy tratando de resolver implica varias instrucciones UPDATE bajo la misma tabla, cada una tomando y transformando los valores de las iteraciones anteriores. Esto no es posible en una sola declaración grande de ACTUALIZACIÓN, ya que cada fila se evaluará y actualizará solo una vez, por lo que un ciclo es la única forma en que puedo resolverlo para que funcione.

+4

Si está pensando en el control de flujo para el código de la base de datos, lo está haciendo mal. –

+4

No sea tan inflexible, a veces la lógica de negocio debe desarrollarse en procedimientos almacenados. – Rodrigo

+0

@rodrigo, él no está hablando de que sea un proceso almacenado, está hablando de usar la teoría de conjuntos y no de un bucle. Es posible evitar el ciclo aproximadamente el 99% del tiempo y SIEMPRE es preferible hacerlo si puede. – HLGEM

Respuesta

39

Esto es efectivamente un bucle do-while:

WHILE (1=1) 
    BEGIN 

    -- Do stuff... 

    IF (some_condition is true) 
    BREAK; 

    END 

Pero como se ha señalado @ Joel Coehoorn, siempre trata de utilizar un enfoque basado en el juego por primera vez. Solo recurriría a un bucle si no puedo pensar en una forma de resolver el uso de operaciones de conjunto.

+1

1 no es un valor booleano, en lugar de esto (1 = 1) puede hacer el trabajo. Esta solución funciona y es muy simple. Parece obvio después de leer! Muchas gracias. – Rodrigo

+1

@Rodrigo: actualizado. Gracias. –

+8

Esto funcionará, pero hombre si escribir "1 = 1" no está presionando en el código de producción ... –

Cuestiones relacionadas