none
Cursor mi consente di iterare in modo robusto una SELECT ??? RRS feed

  • Domanda

  • Salve,

    Ho la necessità di creare un cursore nel quale durante lo scorrimento delle righe dovrei eliminare eventuali righe 'inopportune' al fine di ripulire una tabella. Il mio cursore è del tipo :

        DECLARE Cursore_Sped CURSOR
        FOR
            SELECT
                Id
                , IsNull(PesoDa, 0)
                , IsNull(PesoA, 0)
                
            FROM
                TabSpeTrasp

            WHERE
                IsNull(Prov, '') = @Provincia
                AND IsNull(CodSpe, '') = IsNull(@CodSped, '')      
                
            ORDER BY
                IsNull(PesoDa, 0), IsNull(PesoA, 0)
                  
        OPEN Cursore_Sped

        FETCH NEXT FROM Cursore_Sped INTO @Id, @PesoDa, @PesoA

        WHILE @@FETCH_STATUS = 0
            BEGIN
                
                SET @Conta = @Conta + 1
                
                IF (@PesoDa = 0 AND @PesoA = 0)
                    --1. Se esiste un intervallo di pesi 0 elimino tutti gli altri
                    BEGIN
                        DELETE FROM TabSpeTrasp WHERE IsNull(Prov, '') = @Provincia AND IsNull(CodSpe, '') = IsNull(@CodSped, '') AND (IsNull(PesoDa, 0) <> 0 AND IsNull(PesoA, 0) <> 0)    
                        BREAK
                    END
                
                ELSE IF (@PesoDa = 0 AND @PesoA > 0)
                    --2.
                    ...
                
                ELSE IF (@PesoDa > 0 AND @PesoA = 0)
                    --3.
                    ...
                
                ELSE IF (@PesoDa > 0 AND @PesoA > 0)
                    --4.
                    ...
                            
                ELSE
                    --5. Gli intervalli con estremi negativi li cancello
                    BEGIN
                        DELETE FROM TabSpeTrasp WHERE Id = @Id
                    END
                
                FETCH NEXT FROM Cursore_Sped INTO @Id, @PesoDa, @PesoA
            END
            
        CLOSE Cursore_Sped
        DEALLOCATE Cursore_Sped        

    Come è notabile, all'interno dello scorrimento, in base a dei criteri, svolgo delle operazioni di cancellazione righe.

    Le mie domande sono : il cursore ne risente di queste cancellazioni ? Continuerà a funzionare lo scorrimento ? Se no, esistono alternative o altri modi di operare a tal riguardo ???

    Grazie come sempre per gli eventuali consigli.

    martedì 20 novembre 2018 11:07

Risposte

  • non dovrebbe risentirne comunque puoi sempre marcare i record per la cancellazione e far partire una sola operazione di delete dopo che il cursore ha terminato il suo ciclo.

    ciao.


    Edoardo Benussi
    Microsoft MVP - Cloud and Datacenter Management
    e[dot]benussi[at]outlook[dot]it

    lunedì 26 novembre 2018 10:21
    Moderatore

Tutte le risposte