如何在SQL游标循环内判断需执行FETCH NEXT的次数?
订单游标逐行处理解决方案
场景说明
现有如下格式的订单关联记录,需通过游标逐行处理:
V-18244 -- beginning of order 1 Mill -- data belonging to order 1 W/L-1285 -- data belonging to order 1 V-18264 -- beginning of order 2 Mill -- data belonging to order 2 S-18247 -- beginning of order 3 Mill -- data belonging to order 3 W/L-1285 -- data belonging to order 3
通过语句 IF PATINDEX('_-[0-9]%',@ITEM1) >0 识别订单起始行,不同订单后续关联行数不固定(比如订单1有2行后续数据,订单2只有1行)。此前尝试在while @@FETCH_STATUS = 0循环内嵌套循环处理未成功,需要可行的实现方案。
可行实现代码
核心思路是:外层循环处理订单起始行,内层循环持续读取后续行,直到遇到下一个订单起始行或游标结束,确保所有关联数据都能归属到对应订单。
-- 声明变量 DECLARE @ITEM1 VARCHAR(50), @ITEM2 VARCHAR(50), @ITEM3 VARCHAR(50) DECLARE @CurrentOrder VARCHAR(50) -- 声明游标(替换为实际查询逻辑) DECLARE po_cursor CURSOR FOR SELECT Item1, Item2, Item3 FROM YourTargetTable -- 初始化游标 OPEN po_cursor FETCH NEXT FROM po_cursor INTO @ITEM1, @ITEM2, @ITEM3 -- 外层循环:处理每个订单起始行 WHILE @@FETCH_STATUS = 0 BEGIN -- 判断当前行是订单起始行 IF PATINDEX('_-[0-9]%', @ITEM1) > 0 BEGIN SET @CurrentOrder = @ITEM1 -- 输出或处理订单起始行数据 SELECT @CurrentOrder AS '订单编号', '起始行' AS '行类型' -- 内层循环:读取当前订单的所有后续关联行 FETCH NEXT FROM po_cursor INTO @ITEM1, @ITEM2, @ITEM3 WHILE @@FETCH_STATUS = 0 AND PATINDEX('_-[0-9]%', @ITEM1) = 0 BEGIN -- 输出或处理当前订单的关联数据行 SELECT @CurrentOrder AS '所属订单', @ITEM1 AS '关联数据', '关联行' AS '行类型' -- 继续读取下一行 FETCH NEXT FROM po_cursor INTO @ITEM1, @ITEM2, @ITEM3 END -- 此时@ITEM1已指向新订单起始行或游标结束,外层循环将自动处理 END ELSE BEGIN -- 异常处理:处理未归属任何订单的孤立行(可选) SELECT '异常孤立行', @ITEM1 AS '行数据' FETCH NEXT FROM po_cursor INTO @ITEM1, @ITEM2, @ITEM3 END END -- 关闭并释放游标 CLOSE po_cursor DEALLOCATE po_cursor
逻辑说明
- 外层循环负责定位每个订单的起始行,记录当前订单编号。
- 内层循环从起始行之后开始读取,只要读取到的行不是新的订单起始行,就将其归为当前订单的关联数据,持续读取直到遇到下一个订单起始行或游标结束。
- 内层循环结束后,游标指向的下一行已经是新的订单起始行(或游标状态为-1),外层循环会自动处理这个新的起始行,无需额外调整。
内容的提问来源于stack exchange,提问作者nibblebytes07
相关产品推荐
相关产品推荐

