Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como executo um procedimento armazenado uma vez para cada linha retornada pela consulta?


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