You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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. 外层循环负责定位每个订单的起始行,记录当前订单编号。
  2. 内层循环从起始行之后开始读取,只要读取到的行不是新的订单起始行,就将其归为当前订单的关联数据,持续读取直到遇到下一个订单起始行或游标结束。
  3. 内层循环结束后,游标指向的下一行已经是新的订单起始行(或游标状态为-1),外层循环会自动处理这个新的起始行,无需额外调整。

内容的提问来源于stack exchange,提问作者nibblebytes07

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 17:50:45