SQL Server中如何循环遍历字符串实现数值批量除以10的处理
SQL Server字符串数值批量处理实现方案
原代码问题排查
你提交的自定义函数存在以下几类错误,导致无法得到预期结果:
- 语法错误:返回值定义
RETURNS varchar(120缺少右括号,无法正常编译 - 核心逻辑反向:需求是仅处理纯数字片段除以10,保留
F1这类混合字母数字的字段名,原有判断条件刚好写反,且会出现类型转换报错 - 变量未初始化:
@Concat默认值为NULL,字符串拼接操作会一直返回NULL - 边界值未兼容:字符串最后一个元素后没有空格,
CHARINDEX返回0会导致截取逻辑报错 - 字符串更新逻辑错误:使用
REPLACE更新原字符串会误替换重复出现的子串,应该直接截取剩余部分
正确实现代码
ALTER FUNCTION [name_of_function] (@Chain varchar(120)) RETURNS varchar(120) AS BEGIN DECLARE @Result varchar(120) = '', @Pos int, @CurrentSeg varchar(50) -- 末尾补空格统一处理最后一个元素的截取逻辑 SET @Chain = @Chain + ' ' WHILE LEN(@Chain) > 0 BEGIN SET @Pos = CHARINDEX(' ', @Chain) IF @Pos = 0 BREAK SET @CurrentSeg = SUBSTRING(@Chain, 1, @Pos - 1) -- 判断当前片段是否为纯数字 IF @CurrentSeg NOT LIKE '%[^0-9]%' BEGIN -- 纯数字先转int除以10,再拼接 SET @Result += CAST(CAST(@CurrentSeg AS INT) / 10 AS VARCHAR(10)) + ' ' END ELSE BEGIN -- 非数字片段直接保留 SET @Result += @CurrentSeg + ' ' END -- 直接截取空格后的剩余部分,避免误替换 SET @Chain = SUBSTRING(@Chain, @Pos + 1, LEN(@Chain) - @Pos) END -- 移除末尾多余的空格后返回 RETURN RTRIM(@Result) END
调用验证
输入参数为'F1 100 F2 400 F3 600'时,返回结果为'F1 10 F2 40 F3 60',完全符合需求。
内容的提问来源于stack exchange,提问作者Noelia
相关产品推荐
相关产品推荐

