如何编写SQL识别PDF文件表新旧命名数据,确定待保留与删除条目
核心判断规则
- 符合新命名规则的文件判定条件:文件名包含
_R_数字或_C_数字片段,SQL中用LIKE匹配时,下划线需要用方括号转义避免被识别为通配符 - 仅当同一个PAR分组下存在至少1个符合新规则的文件时,该分组内所有不符合新规则的文件标记为待删除;如果分组下无符合新规则的文件,所有文件均保留,避免误删
实现SQL示例(适配SQL Server,兼容SSIS集成场景)
验证用查询语句
可先运行该语句核对标记结果是否符合预期:
SELECT PAR, ORIGFILENAME, -- 标记是否符合新命名规则:1=是,0=否 CASE WHEN ORIGFILENAME LIKE '%[_]R_[0-9]%' OR ORIGFILENAME LIKE '%[_]C_[0-9]%' THEN 1 ELSE 0 END AS IS_NEW_FILE, -- 标记是否需要删除:1=待删除,0=保留 CASE WHEN MAX(CASE WHEN ORIGFILENAME LIKE '%[_]R_[0-9]%' OR ORIGFILENAME LIKE '%[_]C_[0-9]%' THEN 1 ELSE 0 END) OVER (PARTITION BY PAR) = 1 AND ORIGFILENAME NOT LIKE '%[_]R_[0-9]%' AND ORIGFILENAME NOT LIKE '%[_]C_[0-9]%' THEN 1 ELSE 0 END AS TO_DELETE FROM 你的PDF清单表名
表更新语句
确认逻辑无误后,可直接给表添加标记列并更新结果:
-- 新增删除标记列(仅需执行一次) ALTER TABLE 你的PDF清单表名 ADD TO_DELETE TINYINT DEFAULT 0; -- 执行标记更新 UPDATE t SET TO_DELETE = 1 FROM 你的PDF清单表名 t WHERE -- 当前文件为旧规则文件 t.ORIGFILENAME NOT LIKE '%[_]R_[0-9]%' AND t.ORIGFILENAME NOT LIKE '%[_]C_[0-9]%' -- 对应PAR分组下存在新规则文件 AND EXISTS ( SELECT 1 FROM 你的PDF清单表名 t2 WHERE t2.PAR = t.PAR AND (t2.ORIGFILENAME LIKE '%[_]R_[0-9]%' OR t2.ORIGFILENAME LIKE '%[_]C_[0-9]%') )
注意事项
- 执行更新操作前务必先运行查询语句核对标记结果,确认符合预期后再执行更新
- 逻辑默认如果某个PAR下没有符合新规则的文件,不会标记任何文件删除,符合无新文件时保留存量旧文件的业务要求
- 该逻辑可以直接集成到SSIS包的SQL任务节点中,每周定时执行即可
内容的提问来源于stack exchange,提问作者Eric G
相关产品推荐
相关产品推荐

