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