sql >> Databasteknik >  >> RDS >> Sqlserver

Hur kör jag en lagrad procedur en gång för varje rad som returneras av en fråga?

använd en markör

ADDENDUM:[MS SQL-markörexempel]

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

i MS SQL, här är en exempelartikel

notera att markörer är långsammare än set-baserade operationer, men snabbare än manuella while-loopar; mer detaljer i denna SO-fråga

TILLÄGG 2:om du kommer att bearbeta mer än bara några få poster, dra in dem i en tillfällig tabell först och kör markören över den tillfälliga tabellen; detta kommer att förhindra SQL från att eskalera till tabelllås och påskynda driften

TILLÄGG 3:och naturligtvis, om du kan infoga vad din lagrade procedur gör med varje användar-ID och köra det hela som en enda SQL-uppdateringssats, skulle det vara optimalt



  1. GROUP BY och COUNT i PostgreSQL

  2. Hur man delar upp en kommaseparerad sträng i Oracle

  3. Arbeta med JavaFX UI och JDBC Applications

  4. Hur skapar man tabell med SQLite-databas i Android?