Loop attraverso tutte le righe di una tabella temporanea e chiamare una stored procedure per ogni riga

Ho dichiarato una tabella temporanea per contenere tutti i valori richiesti come segue:

    DECLARE @temp TABLE
    (
    Password int,
    IdTran int,
    Kind varchar(16)
    )

INSERT INTO @temp
SELECT  s.Password, s.IdTran, 'test'
from signal s inner join vefify v 
    on s.Password = v.Password 
and s.IdTran = v.IdTran 
and v.type = 'DEV' 
where s.[Type] = 'start' 
AND NOT EXISTS (SELECT * FROM signal s2
            WHERE s.Password = s2.Password 
            and s.IdTran = s2.IdTran 
            and s2.[Type] = 'progress' )

INSERT INTO @temp
SELECT  s.Password, s.IdTran, 'test'
from signal s inner join vefify v 
    on s.Password = v.Password 
and s.IdTran = v.IdTran 
and v.type = 'PROD' 
where s.[Type] = 'progress' 
AND NOT EXISTS (SELECT * FROM signal s2
            WHERE s.Password = s2.Password 
            and s.IdTran = s2.IdTran 
            and s2.[Type] = 'finish' )

Ora ho bisogno di scorrere le righe in @temp tabella e e per ogni riga chiamare un sp che prende tutti i parametri di @temp tabella come input.
Come posso realizzare questo?

  • Fa il tuo proc ritorno più o singola riga per ogni valore di @temp tabella. se proc restituisce solo di singola fila/valore vorrei condider riscrittura questo per chiamare la funzione. In questo modo è possibile eseguire per ogni valore della tabella senza cursors = CURSES o LOOPS. SQL è destinata a fare il set di base di elaborazione non passanti. La maggior parte delle persone nella comunità di evitare tutto ciò che ha a che con cursors è davvero un curse
InformationsquelleAutor merazuu | 2014-03-24

 

5 Replies
  1. 73

    si potrebbe utilizzare un cursore:

    DECLARE @id int
    DECLARE @pass varchar(100)
    
    DECLARE cur CURSOR FOR SELECT Id, Password FROM @temp
    OPEN cur
    
    FETCH NEXT FROM cur INTO @id, @pass
    
    WHILE @@FETCH_STATUS = 0 BEGIN
        EXEC mysp @id, @pass ... -- call your sp here
        FETCH NEXT FROM cur INTO @id, @pass
    END
    
    CLOSE cur    
    DEALLOCATE cur
    • Come faccio a passare la Password, IdTran, Tipo @temp in stored proc?
    • vedere modifica, aggiunta password aggiungere il resto 🙂
    • Fantastico funziona alla grande! Io sono curioso di sapere se c’è un modo per fare questo senza usare il mouse? Sarebbe più efficiente, senza il cursore(Questo sarà in corsa per centinaia di migliaia di record)?
    • Io non credo che si possa fare senza un cursore. I cursori sono un po ‘ di una cattiva reputazione, ma non sono che inefficiente. Se la tua tabella temp è di qualche migliaio di righe, che io non ti preoccupare…
    • L’ @FETCH_STATUS variabile è un errore di battitura. Si suppone che sia @@FETCH_STATUS (2 e commerciali). Ho provato la modifica di script di cui sopra, ma COSÌ ha bisogno di modifiche per essere di 6 caratteri o più.
    • Grande risposta….

  2. 1

    Provare a ripristinare il set di dati da una stored procedure per la tua datatable in C# o VB.Net. Poi la grande quantità di dati nel datatable può essere copiato la tabella di destinazione utilizzando una Copia di Massa. Ho usato BulkCopy per il caricamento di grandi datatable con migliaia di righe, in tabelle Sql con ottimo successo in termini di prestazioni.

    Si potrebbe desiderare di sperimentare con BulkCopy in C# o VB.Net codice.

  3. 1

    qualcosa di simile a questo?

    DECLARE maxval, val, @ind INT;
    SELECT MAX(ID) as maxval FROM table;
    
    while (ind <= maxval  ) DO           
    
          select `value` as val from `table` where `ID`=ind;
    
          CALL fn(val);
    
          SET ind = ind+1;
    end while;
  4. 0

    Si può fare qualcosa di simile

        Declare @min int=0, @max int =0 --Initialize variable here which will be use in loop 
        Declare @Recordid int,@TO nvarchar(30),@Subject nvarchar(250),@Body nvarchar(max)  --Initialize variable here which are useful for your
    
        select ROW_NUMBER() OVER(ORDER BY [Recordid] )  AS Rownumber, Recordid, [To], [Subject], [Body], [Flag]
                into #temp_Mail_Mstr FROM Mail_Mstr where Flag='1'  --select your condition with row number & get into a temp table
    
        set @min = (select MIN(RecordID) from #temp_Mail_Mstr); --Get minimum row number from temp table
        set @max = (select Max(RecordID) from #temp_Mail_Mstr);  --Get maximum row number from temp table
    
       while(@min <= @max)
       BEGIN
            select @Recordid=Recordid, @To=[To], @Subject=[Subject], @Body=Body from #temp_Mail_Mstr where Rownumber[email protected]min
    
            -- You can use your variables (like @Recordid,@To,@Subject,@Body) here  
            -- Do your work here 
    
            set @min[email protected]min+1 --Increment of current row number
        END
  5. -2

    Sempre non hanno bisogno di un cursore per questo. Si può fare con un ciclo while. Si dovrebbe evitare di cursori, quando possibile. Mentre il ciclo è più veloce di cursori.

    • Di cosa stai parlando, compagno ?
    • Quello che stai chiedendo il mio amico? Si pensi sempre bisogno di un cursore?
    • Non sto dicendo che le vostre affermazioni non sono corrette. Sto dicendo che ti ha dato una risposta cattiva. Non spiega nulla o dare indicazioni su dove trovare ulteriori informazioni. La tua risposta non aiutare in alcun modo.

Lascia un commento