Jak wykonać iterację zestawu wyników przy użyciu języka Transact-SQL w programie SQL Server


Podsumowanie


W tym artykule opisano różne metody, których można użyć w celu symulowania logiki instrukcji FETCH-NEXT z kursorem w procedurze składowanej, wyzwalaczu lub partii Transact-SQL.

Używanie instrukcji Transact-SQL do iteracji w zestawie wyników

Istnieją trzy metody, za pomocą których można wykonać iteracje zestawu wyników przy użyciu instrukcji języka Transact-SQL. Jedna metoda jest używana w przypadku tabel tymczasowych . Za pomocą tej metody można utworzyć "migawkę" początkowej instrukcji SELECT i użyć jej jako podstawy do "kursora". Na przyk³ad:
/********** 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
Druga metoda polega na użyciu funkcji min w celu "wymuszenia" tabeli po jednym wierszu naraz. Ta metoda umożliwia przechwytywanie nowych wierszy dodanych po rozpoczęciu wykonywania procedury składowanej, pod warunkiem, że nowy wiersz ma unikatowy identyfikator większy niż bieżący wiersz, który jest przetwarzany w zapytaniu. Na przyk³ad:
/********** 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
Uwaga: w obu przykładach 1 i 2 przyjęto, że dla każdego wiersza w tabeli źródłowej istnieje unikatowy identyfikator. W niektórych przypadkach nie może istnieć żaden unikatowy identyfikator. W takim przypadku można zmodyfikować metodę tabeli temp , aby używać nowo utworzonej kolumny klucza. Na przyk³ad:
/********** 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