use um cursor
ADENDO:[exemplo de cursor 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
em MS SQL, aqui está um artigo de exemplo
observe que os cursores são mais lentos do que as operações baseadas em conjunto, mas mais rápidos do que os while-loops manuais; mais detalhes nesta pergunta SO
ADENDO 2:se você for processar mais do que apenas alguns registros, puxe-os primeiro para uma tabela temporária e passe o cursor sobre a tabela temporária; isso impedirá que o SQL se transforme em bloqueios de tabela e acelere a operação
ADENDO 3:e, claro, se você puder embutir o que quer que seu procedimento armazenado esteja fazendo em cada ID de usuário e executar tudo como uma única instrução de atualização SQL, isso seria ideal