Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come eseguo una stored procedure una volta per ogni riga restituita dalla query?

usa un cursore

ADDENDUM:[Esempio cursore MS SQL]

declare @field1 int
declare @field2 int
declare cur CURSOR LOCAL for
    select field1, field2 from sometable where someotherfield is null

open cur

fetch next from cur into @field1, @field2

while @@FETCH_STATUS = 0 BEGIN

    --execute your sproc on each row
    exec uspYourSproc @field1, @field2

    fetch next from cur into @field1, @field2
END

close cur
deallocate cur

in MS SQL, ecco un articolo di esempio

si noti che i cursori sono più lenti delle operazioni basate su set, ma più veloci dei cicli while manuali; maggiori dettagli in questa domanda SO

ADDENDUM 2:se elaborerai più di pochi record, inseriscili prima in una tabella temporanea e sposta il cursore sulla tabella temporanea; questo eviterà che SQL si trasformi in table-lock e accelererà l'operazione

ADDENDUM 3:e, naturalmente, se puoi incorporare qualsiasi cosa la tua procedura memorizzata sta facendo su ciascun ID utente ed eseguire il tutto come una singola istruzione di aggiornamento SQL, sarebbe ottimale