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
相关产品推荐
相关产品推荐

