sql >> Database teknologi >  >> RDS >> Sqlserver

Hvordan udfører jeg en lagret procedure én gang for hver række, der returneres af forespørgsel?

brug en markør

TILFØJ:[MS SQL cursor eksempel]

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, her er et eksempel på en artikel

Bemærk, at markører er langsommere end sæt-baserede operationer, men hurtigere end manuelle while-loops; flere detaljer i dette SO-spørgsmål

TILFØJ 2:hvis du skal behandle mere end blot nogle få poster, skal du først trække dem ind i en midlertidig tabel og køre markøren over den midlertidige tabel; dette vil forhindre SQL i at eskalere til tabellåse og fremskynde driften

TILFØJ 3:og selvfølgelig, hvis du kan inline, hvad end din lagrede procedure gør med hvert bruger-id og køre det hele som en enkelt SQL-opdateringssætning, ville det være optimalt



  1. Sådan installeres PgBackRest

  2. Forespørgsel til ORDER BY antallet af rækker returneret fra en anden SELECT

  3. Sådan indstilles tegnsættet og samlingen af ​​en database i MySQL

  4. Sådan slettes identitetsegenskaber for en kolonne i SQL Server-tabel - SQL Server / T-SQL vejledning 44