如何用WHILE循环替代游标遍历FileID并逐个赋值输出?
问题分析与解决
你的代码存在几个核心问题,导致每次循环都无法正确获取单个FileID:
- 变量名混乱:声明的
@fil和代码里的@filid、@fileid不统一,既会触发语法错误,也无法实现正确赋值 - 查询未限制行数:每次循环的SELECT语句未指定只取当前行,返回所有去重后的FileID,赋值给变量时只会保留最后一个值
- 循环条件错误:
@i <= @count会导致多执行一次无效循环,因为索引从0开始,总共有@count条数据,循环应在@i < @count时运行 - 赋值语法错误:直接
@filid = SELECT ...不符合SQL语法规范
修正后的代码
DECLARE @i INT = 0; DECLARE @count INT, @fil varchar(100); -- 获取去重后的FileID总数 SELECT @count = COUNT(DISTINCT m.FileID) FROM [EDW].[FileMaster] m; WHILE @i < @count BEGIN -- 每次循环取当前索引对应的单个FileID SELECT @fil = m.FileID FROM ( SELECT DISTINCT FileID FROM [EDW].[FileMaster] ORDER BY FileID -- OFFSET/FETCH必须配合排序,否则返回顺序无意义 ) m OFFSET @i ROWS FETCH NEXT 1 ROWS ONLY; PRINT @fil; SET @i = @i + 1; END
关键修改说明
- 统一变量名:全程使用
@fil存储当前循环的FileID,避免变量混乱 - 添加排序与行限制:给去重后的FileID子查询加上
ORDER BY(OFFSET/FETCH依赖排序规则,否则返回顺序不确定),通过OFFSET @i ROWS FETCH NEXT 1 ROWS ONLY每次只取当前索引对应的行 - 修正循环条件:改为
@i < @count,避免超出数据范围的无效循环 - 规范赋值语法:使用
SELECT @fil = ...的方式将单行结果赋值给变量
执行上述代码后,会逐个打印每个去重后的FileID,符合你期望的abc.txt def.txt ghi.txt etc输出效果。
内容的提问来源于stack exchange,提问作者Anusha
相关产品推荐
相关产品推荐

