V TOMTO ÚKOLU
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