在 SQL Server 中使用 Transact-SQL 來遍歷結果集

本文說明各種方法,可讓您在 SQL Server 中使用 Transact-SQL 來迴圈查看結果集。

原始產品版本:   Sqlserver
原始 KB 編號:   111401

摘要

本文說明各種方法,可讓您在預存程式、觸發器或 Transact-SQL 批次中模擬類似于游標的 FETCH 的後續邏輯。

使用 Transact-SQL 語句來迴圈查看結果集

您可以使用三種方法來使用 Transact-SQL 語句來迴圈查看結果集。

其中一個方法是使用 temp 資料表。 使用此方法,您可以建立初始語句的快照 SELECT ,並將它當做對照指標的基礎使用。 例如:

/********** example 1 **********/
declare @au_id char( 11 )

set rowcount 0
select * into #mytemp from authors

set rowcount 1

select @au_id = au_id from #mytemp

while @@rowcount <> 0

begin
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/>
end
set rowcount 0

第二種方法是使用 min 函數一次一列地流覽資料表。 此方法會捕捉在預存程式開始執行之後所新增的新資料列,只要新列的唯一識別碼大於目前在查詢中處理的資料列。 例如:

/********** example 2 **********/
declare @au_id char( 11 )

select @au_id = min( au_id ) from authors
while @au_id is not null

begin
select * from authors where au_id = @au_id
select @au_id = min( au_id ) from authors where au_id > @au_id
end

注意

範例1和2會假設來源表中的每一列都有唯一的識別碼。 在某些情況下,可能不會存在任何唯一識別碼。 如果是這種情況,您可以修改 temp table 方法,以使用新建立的索引鍵欄。 例如:

/********** example 3 **********/
set rowcount 0
select NULL mykey, * into #mytemp from authors

set rowcount 1
update #mytemp set mykey = 1

while @@rowcount > 0
begin
set rowcount 0
select * from #mytemp where mykey = 1
delete #mytemp where mykey = 1
set rowcount 1
update #mytemp set mykey = 1
end
set rowcount 0

參考

ROW_NUMBER (Transact-SQL)