#pdf #ssis #row #ssms #charindex
#PDF #ssis #строка #ssms #charindex
Вопрос:
Всем доброго утра,
У меня небольшой ментальный блок, и я собирался посмотреть, может ли кто-нибудь мне помочь. У меня есть таблица, в которой перечислены 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. Я ценю любую помощь и подстрекательство.
Комментарии:
1. Предположительно, поскольку вы упомянули SSIS, вы используете SQL Server, если это так, пожалуйста, ОТМЕТЬТЕ соответствующим образом.
Ответ №1:
Следующее должно сработать, хотя было бы полезно использовать более разнообразный объем выборочных данных.
Следующее использует обновляемый CTE для идентификации имен старого / нового формата и удаляет старый формат, в котором тот же PAR имеет новый формат
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)
Ответ №2:
Если вы пытаетесь выделить записи, которые хотите удалить, и хотите возвращать записи только в старом формате, когда существуют записи 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;