如何在 SQL Server 中使用 Transact-sql 遍历结果集


概要


本文介绍可用于模拟存储过程、触发器或 Transact-sql 批处理中类似于游标的 FETCH 的下一个逻辑的各种方法。

使用 Transact-sql 语句循环访问结果集

有三种方法可用于通过使用 Transact-sql 语句循环访问结果集。一种方法是使用 临时 表。 使用此方法,你可以创建初始 SELECT 语句的 "快照",并将其用作 "cursoring" 的基础。 例如:
/********** 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
第二种方法是使用 min 函数一次 "遍历" 表格一行。 此方法捕获在存储过程开始执行后添加的新行,前提是新行的唯一标识符比查询中正在处理的当前行更大。 例如:
/********** 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
注意:示例1和2都假定源表中的每一行都有唯一标识符。 在某些情况下,可能不存在唯一标识符。 如果是这种情况,您可以修改 temp table 方法以使用新创建的键列。 例如:
/********** 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