sql >> Database >  >> RDS >> Sqlserver

Hoe voer ik één keer een opgeslagen procedure uit voor elke rij die door een query wordt geretourneerd?

gebruik een cursor

ADDENDUM:[voorbeeld MS SQL-cursor]

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 is een voorbeeldartikel

merk op dat cursors langzamer zijn dan op sets gebaseerde bewerkingen, maar sneller dan handmatige while-loops; meer details in deze SO-vraag

ADDENDUM 2:als u meer dan een paar records gaat verwerken, trek ze dan eerst naar een tijdelijke tabel en beweeg de cursor over de tijdelijke tabel; dit voorkomt dat SQL escaleert in table-locks en versnelt de werking

ADDENDUM 3:en natuurlijk, als je wat je opgeslagen procedure ook doet inline kunt doen met elke gebruikers-ID en het hele ding als een enkele SQL-update-instructie kunt uitvoeren, zou dat optimaal zijn



  1. HubSpot ODBC-stuurprogramma

  2. Hoe breid ik door komma's gescheiden waarden uit in afzonderlijke rijen met SQL Server 2005?

  3. INVOEREN IN ... SELECTEER UIT ... OP DUPLICATE KEY UPDATE

  4. Een serverloze GraphQL-API maken voor MySQL, Postgres en Aurora