sql >> Databáze >  >> RDS >> Sqlserver

Jak provedu uloženou proceduru jednou pro každý řádek vrácený dotazem?

použijte kurzor

DODATEK:[Příklad kurzoru 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

v MS SQL, zde je příklad článku

všimněte si, že kurzory jsou pomalejší než operace založené na množinách, ale rychlejší než ruční smyčky while; více podrobností v této otázce SO

DODATEK 2:pokud budete zpracovávat více než jen několik záznamů, natáhněte je nejprve do dočasné tabulky a přesuňte kurzor nad dočasnou tabulku; to zabrání eskalaci SQL do uzamčení tabulek a urychlí provoz

DODATEK 3:a samozřejmě, pokud můžete vložit cokoliv, co vaše uložená procedura dělá, s každým ID uživatele a spustit celou věc jako jediný příkaz aktualizace SQL, bylo by to optimální



  1. Chyba SQL Oracle LEFT JOIN a SUBQUERY:ORA-00905:chybějící klíčové slovo

  2. Čísla řádků s nedeterministickým pořadím

  3. Oracle zkopíruje data do jiné tabulky

  4. Kniha „PostgreSQL 9.0 High Performance“ je venku