Jak iterovat sadu výsledků pomocí jazyka Transact-SQL v SQL serveru


Shrnutí


Tento článek popisuje různé metody, pomocí kterých můžete simulovat kurzorovou logiku metody FETCH-NEXT v uložené proceduře, aktivační události nebo v dávce Transact-SQL.

Použití příkazů jazyka Transact-SQL k iterování v sadě výsledků

Existují tři způsoby, jak můžete iterovat sadu výsledků pomocí příkazů Transact-SQL. Jedním z metod je použití dočasných tabulek. Pomocí této metody vytvoříte "snímek" počátečního příkazu SELECT a použijete ho jako základ pro "kurzor". Například:
/********** example 1 **********/ declare @au_id char( 11 )set rowcount 0select * into #mytemp from authorsset rowcount 1select @au_id = au_id from #mytempwhile @@rowcount <> 0begin    set rowcount 0    select * from #mytemp where au_id = @au_id    delete #mytemp where au_id = @au_id    set rowcount 1    select @au_id = au_id from #mytemp<BR/>endset rowcount 0
Druhým způsobem je použití funkce min k prominutí tabulky po řádcích. Tato metoda zachytí nové řádky, které byly přidány po dokončení uložené procedury, pokud má nový řádek jedinečný identifikátor větší než aktuální řádek, který se zpracovává v dotazu. Například:
/********** example 2 **********/ declare @au_id char( 11 )select @au_id = min( au_id ) from authorswhile @au_id is not nullbegin    select * from authors where au_id = @au_id    select @au_id = min( au_id ) from authors where au_id > @au_idend
Poznámka: oba příklad 1 a 2 předpokládají, že pro každý řádek zdrojové tabulky existuje jedinečný identifikátor. V některých případech nesmí existovat žádný jedinečný identifikátor. V takovém případě můžete upravit metodu dočasné tabulky a použít nově vytvořený sloupec klíče. Například:
/********** example 3 **********/ set rowcount 0select NULL mykey, * into #mytemp from authorsset rowcount 1update #mytemp set mykey = 1while @@rowcount > 0begin    set rowcount 0    select * from #mytemp where mykey = 1    delete #mytemp where mykey = 1    set rowcount 1    update #mytemp set mykey = 1endset rowcount 0