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

SQL Server嵌套游标无数据输出问题求助

嵌套游标内层无数据输出的问题解决

问题场景

有主从结构的两张表ACC_POL_RULE和ACC_POL_COND,尝试通过嵌套游标遍历主表ACC_POL_RULE的指定记录(rule_id 3、6),并对应遍历从表ACC_POL_COND中关联的cond_id。但执行代码后仅打印外层的Rule:3、Rule:6,内层游标Cur_Cond无任何Cond记录输出,而实际ACC_POL_COND表中存在对应rule_id的关联数据。

问题原因

内层游标Cur_Cond在外层循环之前就完成了声明,此时变量@v_cur_rule_id还未被赋值(初始为NULL),导致游标的查询条件WHERE rule_id = @v_cur_rule_id等价于WHERE rule_id IS NULL,自然匹配不到任何记录。后续外层循环中@v_cur_rule_id被赋值后,已经声明的游标不会自动更新查询逻辑,因此每次打开内层游标时都是基于NULL的查询,无数据输出。

修正后的代码

BEGIN
    --set NOCOUNT ON;

    DECLARE Cur_Rule CURSOR LOCAL READ_ONLY FORWARD_ONLY FOR
        SELECT rule_id 
        FROM OMEGACA.ACC_POL_RULE 
        WHERE rule_id IN (3, 6) 
        ORDER BY rule_id;

    DECLARE @v_cur_rule_id  int;
    DECLARE @v_cur_cond_id  int;

    -- BEGIN LOOP C_RULE
    OPEN Cur_Rule;
    FETCH NEXT FROM Cur_Rule INTO @v_cur_rule_id;

    WHILE @@FETCH_STATUS = 0 
    BEGIN
        PRINT ('Rule:' + CONVERT(NVARCHAR(10), @v_cur_rule_id));

        -- 将内层游标声明移到外层循环内部,确保使用当前的@v_cur_rule_id
        DECLARE Cur_Cond CURSOR LOCAL READ_ONLY FORWARD_ONLY FOR
            SELECT cond_id 
            FROM OMEGACA.ACC_POL_COND 
            WHERE rule_id = @v_cur_rule_id 
            ORDER BY cond_id;

        -- BEGIN LOOP C_COND
        OPEN Cur_Cond;
        FETCH NEXT FROM Cur_Cond INTO @v_cur_cond_id;

        WHILE @@FETCH_STATUS = 0 
        BEGIN
            PRINT ('Cond:' + CONVERT(NVARCHAR(10), @v_cur_cond_id));
            FETCH NEXT FROM Cur_Cond INTO @v_cur_cond_id;           
        END;

        CLOSE Cur_Cond;
        DEALLOCATE Cur_Cond; -- 每次使用后释放内层游标
        -- END LOOP C_COND

        FETCH NEXT FROM Cur_Rule INTO @v_cur_rule_id;
    END;

    CLOSE Cur_Rule;
    DEALLOCATE Cur_Rule;
    -- END LOOP C_RULE
END;

关键改动说明

  • 将内层游标Cur_Cond的声明逻辑移至外层循环内部,每次外层循环获取新的@v_cur_rule_id后,再创建对应条件的内层游标,确保查询条件使用当前有效的rule_id。
  • 每次关闭内层游标后,执行DEALLOCATE Cur_Cond释放游标资源,避免下一次循环声明同名游标时抛出错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 18:33:17