8
votes

SQL Server Comment iTEREZ-VOUS à travers une boucle de curseur une fois quand une condition spécifique se produit

J'ai un curseur SQL Server. Je veux sauter une itération de la boucle lorsqu'une condition spécifique se produit. La pause vous emmène hors de la boucle du curseur et continuez pas à ne rien faire.

Y a-t-il une commande qui dit "hey cet enregistrement n'est pas bon alors laissez-le aller de l'avant et de le traverser sur le suivant".

Au fait, je sais que les curseurs sont diaboliques comme des pilotes qui vont 43 mph dans la voie de passage, mais aussi souvent dans des logiciels, je suis bloqué.

merci


0 commentaires

5 Réponses :


0
votes

Il pourrait être plus facile de répondre à cela si nous savions ce que le code du curseur ressemblait. Peut-être que vous pouvez mettre dans une instruction IF qui vérifie la condition et ne fait que quelque chose si la condition n'est pas présente.


0 commentaires

12
votes

Si vous codez votre boucle avec la récupération en bas (avec la récupération initiale avant que la boucle), continuez simplement vous sauter au sommet, et transformez la même ligne à nouveau. Vous pouvez utiliser un goto pour passer à la partie de récupération en bas ou restructurer la boucle pour aller chercher en haut et la focalisation fonctionnera.

Vous pouvez modifier votre boucle pour utiliser GOTO ... P>

DECLARE <cursor_name> CURSOR FOR
    SELECT
    FROM
    WHERE
    FOR READ ONLY

--populate and allocate resources to the cursor
OPEN <cursor_name>

--process each row
WHILE 1=1
BEGIN

    FETCH NEXT FROM <cursor_name>
        INTO @a, @b, @c

    --finished fetching all rows?
    IF @@FETCH_STATUS <> 0
    BEGIN --YES, all done fetching
        --exit the loop
        BREAK
    END --IF finished fetching

    --do something here--
    --do something here--

    IF <your condition>
    BEGIN
        CONTINUE  -- fetch next row
    END

    --do something here--
    --do something here--

END --WHILE

--close and free the cursor's resources
CLOSE <cursor_name>
DEALLOCATE <cursor_name>


1 commentaires

La déclaration GOTO a beaucoup aidé. Merci.



8
votes

Pourquoi n'utilisez-vous pas simplement une instruction IF:

IF 'condition exists that I want to update'
BEGIN

....

END

Fetch Next


0 commentaires

0
votes

La réponse bon marché consiste à insérer un bloc If: Commencez la boucle / si la ligne est bonne ... boucle finale / fin.


0 commentaires

-1
votes

Je n'ai jamais trouvé de curseur SQL, je ne pouvais pas enlever avec une petite pensée et les gains de performance sont généralement énormes. Y a-t-il une raison pour laquelle vous ne pouvez pas sélectionner que les lignes que vous souhaitez utiliser sur, plutôt que de faire une rangée par traitement de ligne?


0 commentaires