在 SQL Server 中使用 Transact-SQL 循环访问结果集
本文介绍在 SQL Server 中使用 Transact-SQL 循环访问结果集的各种方法。
原始产品版本:SQL Server
原始 KB 编号: 111401
摘要
本文介绍可用于在存储过程、触发器或 Transact-SQL 批处理中模拟类似 FETCH
-NEXT
游标的逻辑的各种方法。
使用 Transact-SQL 语句循环访问结果集
可以使用三种方法通过 Transact-SQL 语句循环访问结果集。
一种方法是使用临时表。 使用此方法,可以创建初始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
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 都假定源表中的每一行都有唯一标识符。 在某些情况下,可能不存在唯一标识符。 如果是这种情况,可以修改临时表方法以使用新创建的键列。 例如:
/********** 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
References
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈