大家好,
我有点精神障碍,想看看是否有人能帮我。我有一张表格,里面列出了我们办公室创建的PDF文件。我们已经更改了命名约定,我正在尝试开发逻辑,指定何时创建具有新命名约定的PDF来标记旧的PDF,以便我可以开发一个批处理脚本,将它们从文件位置移出。下面是一些例子。顺便说一句,每个文件都是表中自己的一行。
PAR ORIGFILENAME
111100000012 | 1100000012.pdf
111100000012 | 1100000012_C_1_UB.pdf
111100000012 | 1100000012_R_1.pdf
新的命名约定包含_R_Number或_C_Number。在上面的例子中,第一个文件是旧的,我想保留第二个2。
第二个例子有更多。以下是5个文件。我想保留具有新命名约定的最后两个,并删除前3个。
PAR ORIGFILENAME
1100000076 1100000076-2.pdf
1100000076 1100000076-3.pdf
1100000076 1100000076.pdf
1100000076 1100000076_C_7_BARN.pdf
1100000076 1100000076_R_1.pdf
如果我能在存在新文件时对这些旧文件进行键入,我的计划是将这些名称开发到批处理脚本中,并将其合并到SSIS包中,该包将每周运行一次,以保持PDF存储库的清洁。我感谢任何帮助和煽动。
以下内容应该会起作用,尽管更丰富多样的样本数据会很有用。
以下使用可更新的CTE来识别旧/新格式名称,并删除旧格式,其中同一标准杆数具有新格式
with f as (
select *,
case when OrigFilename like '%*_%' escape '*' then 0 else 1 end del
from t
)
delete from f
where del=1
and exists (select * from f f2 where f2.par=f.par and f2.del=0)
如果您试图突出显示要删除的记录,并且只想在同时存在C_7和R_1记录的情况下以旧格式返回记录,可能是这样的?
;WITH c_7_records AS (
SELECT par
FROM my_table
WHERE origfilename LIKE '%_C_7_%'
),
r_1_records AS (
SELECT par
FROM my_table
WHERE origfilename LIKE '%_R_1%'
),
records_to_remove AS (
SELECT
DISTINCT mt.origfilename
FROM my_table AS mt
JOIN c_7_records AS cr ON mt.par = cr.par
JOIN r_1_records AS rr ON mt.par = rr.par
WHERE mt.origfilename NOT LIKE '%_C_7_%'
AND mt.origfilename NOT LIKE '%_R_1%'
)
SELECT * FROM records_to_remove;
sql fiddle