usa un cursor
ANEXO:[ejemplo de cursor de 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
en MS SQL, aquí hay un artículo de ejemplo
tenga en cuenta que los cursores son más lentos que las operaciones basadas en conjuntos, pero más rápidos que los bucles while manuales; más detalles en esta pregunta SO
ANEXO 2:si va a procesar más de unos pocos registros, llévelos primero a una tabla temporal y pase el cursor sobre la tabla temporal; esto evitará que SQL escale a bloqueos de tabla y acelerará la operación
ANEXO 3:y, por supuesto, si puede alinear lo que sea que su procedimiento almacenado esté haciendo con cada ID de usuario y ejecutarlo todo como una sola declaración de actualización de SQL, eso sería óptimo