SQL Server 2014中T-SQL替换特殊字符结果不符合预期求助
错误原因与修正方案
你的代码核心问题是替换操作没有链式传递上一步的处理结果,绝大多数替换逻辑的输出完全没有被最终引用,具体问题如下:
- 从p3到p8的所有替换步骤,全部错误地基于初始替换后的
p1.[Name]做处理,而非上一步替换完成的结果,这些替换操作的结果互相独立,不会叠加生效。 - 最终你仅取了p9的输出,而p9的输入仅来自p2的处理结果,p3到p8中定义的替换
/、?、\等逻辑的结果完全没有被代入最终计算。比如你示例中需要替换的/字符是在p5步骤处理的,但p5的结果全程没有被后续步骤使用,自然输出时会保留原字符。 - 额外注意:你代码中写的
&是HTML转义后的内容,若实际需求是替换&字符,直接写&即可,否则只会匹配替换&这个字符串。
修正方案1:调整OUTER APPLY的链式引用
每个替换步骤都继承上一步的输出,保证所有替换逻辑叠加生效:
select p9.[Name] from [CleanGuestNames] p outer apply (select replace(p.[Name], '@', '*') as [Name]) p1 outer apply (select replace(p1.[Name], '&', '*') as [Name]) p2 outer apply (select replace(p2.[Name], '\', '*') as [Name]) p3 outer apply (select replace(p3.[Name], '?', '*') as [Name]) p4 outer apply (select replace(p4.[Name], '/', '*') as [Name]) p5 outer apply (select replace(p5.[Name], ':', '*') as [Name]) p6 outer apply (select replace(p6.[Name], ';', '*') as [Name]) p7 outer apply (select replace(p7.[Name], '.', '*') as [Name]) p8 outer apply (select replace(p8.[Name], ',', '*') as [Name]) p9 ;
修正方案2:使用嵌套REPLACE(更简洁)
对于多字符替换的场景,直接嵌套REPLACE函数即可,不需要额外用OUTER APPLY,代码可读性更高:
select replace( replace( replace( replace( replace( replace( replace( replace( replace([Name], '@', '*'), '&', '*'), '\', '*'), '?', '*'), '/', '*'), ':', '*'), ';', '*'), '.', '*'), ',', '*') as [Name] from [CleanGuestNames]
内容的提问来源于stack exchange,提问作者user3115933
相关产品推荐
相关产品推荐

