2009-10-03 7 views
28

J'essaie de comprendre comment implémenter dans TSQLComment mettre en œuvre une boucle do-while dans tsql

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

La seule phrase de flux de contrôle itérative fourni par Transact-SQL est while (condition) sentences qui évalue d'abord la condition et si cette condition est vraie, exécutez la phrase.

Je pense à un scénario comme exécuter une instruction UPDATE sur une table jusqu'à ce qu'une condition déclenchée par la dernière UPDATE exécutée soit atteinte.

le plus important, je suis à la recherche de l'approche moins sale à ce problème (Duplication la mise à jour avant le While ne me faites pas trop de sens que la peine de mise à jour peut être arbitrairement long et complexe)


EDIT: Le problème que j'essaie de résoudre implique plusieurs instructions UPDATE sous la même table, chacune prenant et transformant les valeurs des itérations précédentes. Ce n'est pas possible dans une seule grande instruction UPDATE, car chaque ligne ne sera évaluée et mise à jour qu'une seule fois, donc une boucle est la seule façon de résoudre ce problème.

+4

Si vous envisagez le contrôle de flux pour le code de base de données, vous vous trompez. –

+4

Ne soyez pas si inflexible, parfois la logique métier doit être développée dans les procédures stockées. – Rodrigo

+0

@rodrigo, il isn, en parlant de cela étant un proc stocké, il parle d'utiliser la théorie des ensembles et pas un looop du tout. Il est possible d'éviter la boucle environ 99% du temps et il est TOUJOURS préférable de le faire si vous le pouvez. – HLGEM

Répondre

39

Ceci est effectivement une boucle Do-While:

WHILE (1=1) 
    BEGIN 

    -- Do stuff... 

    IF (some_condition is true) 
    BREAK; 

    END 

Mais comme @Joel Coehoorn noté, essayez toujours d'utiliser une approche basée sur la première série. Je n'aurais recours à une boucle que si je n'arrive pas à trouver un moyen de résoudre les problèmes en utilisant les opérations définies.

+1

1 n'est pas une valeur booléenne, au lieu de cela (1 = 1) peut faire le travail. Cette solution fonctionne et est très simple. Cela semble évident après avoir lu! Merci beaucoup. – Rodrigo

+1

@Rodrigo: avoir mis à jour. THX. –

+8

Cela fonctionnera, mais si vous écrivez "1 = 1" n'est pas déprimant dans le code de production ... –

Questions connexes