Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment exécuter une procédure stockée une fois pour chaque ligne renvoyée par la requête ?

utiliser un curseur

ADDENDUM :[Exemple de curseur 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

dans MS SQL, voici un exemple d'article

notez que les curseurs sont plus lents que les opérations basées sur des ensembles, mais plus rapides que les boucles manuelles ; plus de détails dans cette question SO

ADDENDUM 2 :si vous traitez plus que quelques enregistrements, placez-les d'abord dans une table temporaire et placez le curseur sur la table temporaire ; cela empêchera SQL de se transformer en verrous de table et accélérera l'opération

ADDENDUM 3 :et bien sûr, si vous pouvez intégrer tout ce que votre procédure stockée fait à chaque ID utilisateur et exécuter le tout comme une seule instruction de mise à jour SQL, ce serait optimal