Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie führe ich eine gespeicherte Prozedur einmal für jede von der Abfrage zurückgegebene Zeile aus?

Verwenden Sie einen Cursor

NACHTRAG:[MS SQL-Cursor-Beispiel]

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, hier ist ein Beispielartikel

Beachten Sie, dass Cursor langsamer sind als mengenbasierte Operationen, aber schneller als manuelle While-Schleifen; Weitere Details in dieser SO-Frage

ANHANG 2:Wenn Sie mehr als nur ein paar Datensätze verarbeiten, ziehen Sie sie zuerst in eine temporäre Tabelle und führen Sie den Cursor über die temporäre Tabelle. dies verhindert, dass SQL in Tabellensperren eskaliert, und beschleunigt den Betrieb

ANHANG 3:und natürlich, wenn Sie alles, was Ihre gespeicherte Prozedur mit jeder Benutzer-ID macht, inline inlinen und das Ganze als einzelne SQL-Update-Anweisung ausführen könnten, wäre das optimal