SQL脚本移除字段值$和逗号时如何覆盖所有doctypefieldid取值
字段值全量符号清洗最优方案
首先先指出你原有脚本的几个明显问题:
- 硬编码单个
doctypefieldid,没法批量覆盖190多个目标字段 - 过滤条件用
LIKE '$%'、LIKE ',%'只能匹配字段开头的符号,像1,200$、USD$1,000这种符号出现在中间、末尾的值根本匹配不到,会漏清洗 - 分两次UPDATE会重复扫表,数据量大的时候性能很差
推荐方案:精准范围单次更新(性能最高、风险最低)
核心思路是先圈定所有需要清洗的字段ID(注意不要把存普通文本的字段包含进来,不然文本里正常使用的逗号、$会被误删),再通过一次表扫描完成所有符号替换。
- 第一步:先整理所有待处理的字段ID,建议用临时表存,有字段配置表的话可以直接关联筛选数值/金额类字段,不用手动填190多个ID:
-- 临时表存储所有需要做数值清洗的字段ID SELECT DISTINCT doctypefieldid INTO #NeedCleanFields FROM [dbo].[D_Document_FieldsData] -- 如果有字段配置表,推荐直接关联筛选金额、数值类型字段,避免手动漏填、错填ID -- INNER JOIN [dbo].[D_Doctype_Fields] cf ON cf.doctypefieldid = [dbo].[D_Document_FieldsData].doctypefieldid -- WHERE cf.field_type IN ('currency', 'number') WHERE doctypefieldid IN (1,123,138,144 /* 在这里补全其余需要处理的ID即可 */)
- 第二步:单次关联更新,同时替换$和逗号,匹配规则改成只要字段里包含这两个符号就处理,不管符号在什么位置:
UPDATE fd SET fieldvalue = REPLACE(REPLACE(fd.fieldvalue, '$', ''), ',', '') FROM [dbo].[D_Document_FieldsData] fd INNER JOIN #NeedCleanFields nf ON fd.doctypefieldid = nf.doctypefieldid WHERE fd.fieldvalue LIKE '%[$,]%'
这个方案的优势:
- 只做一次表扫描,比循环执行、多次UPDATE的性能高几倍到几十倍,表数据量越大越明显
- 可以精准控制清洗范围,不会误改文本类字段的正常内容
- 能覆盖字段任意位置的目标符号,不会出现漏清洗的情况
备选方案:全表无差别清洗(仅适合确认全表无有效$、逗号内容的场景)
如果你确认整张表所有字段里的$、逗号都是要移除的无效字符,不需要区分字段类型,可以直接跑更精简的脚本,不用维护字段ID列表:
UPDATE [dbo].[D_Document_FieldsData] SET fieldvalue = REPLACE(REPLACE(fieldvalue, '$', ''), ',', '') WHERE fieldvalue LIKE '%[$,]%'
⚠️ 重要提醒:无论用哪个方案,执行前都建议先开事务做验证,确认更新结果符合预期再提交,避免批量误改:
BEGIN TRANSACTION -- 执行上面的UPDATE语句 -- 抽查修改后的数据,比如查前200条记录确认内容正确 -- SELECT TOP 200 * FROM [dbo].[D_Document_FieldsData] -- 确认无误执行 COMMIT 提交,发现问题执行 ROLLBACK 回滚
内容的提问来源于stack exchange,提问作者Ron Bizzle
相关产品推荐
相关产品推荐

