2016-10-05 3 views
0

Если искали и искали, но не смогли найти правильный ответ:Перемещение файлов с SSIS (2013) в различных каталогах динамически на основе выражения имени файла

Я хочу, чтобы переместить TextFiles с помощью пакета служб SSIS (SQL-Server 2012)

источник файлов в C: \ TEMP

Назначением файлов находится в одном из трех следующих каталогов:

  1. C: \ ARCHIVE \ AAA \
  2. C: \ АРХИВ \ ВВВ \
  3. C: \ АРХИВ \ CCC \

Название файлов случайным образом созданный еще предпосе и иметь 8 цифр имя файла, как: 12345678.txt, 45382746 .txt, 99325555.txt

с помощью пакета служб SSIS Я хочу, чтобы переместить файлы:

в C: \ ARCHIVE \ AAA \ - когда первые две цифры файла находятся между 10 и 29.

до C: \ АРХИВ \ ВВВ \ - когда первые две цифры файла находятся между 30 и 59.

к C: \ АРХИВ \ КТС \ - когда первые две цифры файла находятся между 60 и 00.

Я пытаюсь сделать это без задачи сценария, но только с контейнером цикла foreach с задачей файловой системы внутри с использованием выражений.

У меня есть контейнер цикла foreach, который проходит через разные файлы и сохраняет их в переменной user :: CurrentFile Проблема заключается в том, чтобы динамически перемещать файлы в разные (уже существующие) каталоги в задаче файловой системы.

Любая помощь будет высоко оценена.

+0

Почему вы должны динамически перемещать файлы в разные (уже существующие) каталоги в задаче файловой системы?? – phil652

+0

Потому что я думаю, что это можно сделать без задачи скрипта.Я не очень хорошо разбираюсь в сценариях, и, возможно, я думаю. – Barturion

+0

Но если задача сценариев - это просто способ сделать это, я тоже в порядке. Как администратор базы данных, я более уверен в выражениях. – Barturion

ответ

0

Вы можете использовать это выражение для выбора пути назначения (в Системе Файловой системы), проверяет, что первые две цифры в имени файла находятся в полезном диапазоне, возвращая правильный путь:
(например, C: \ ARCHIVE \ AAA \ когда первые две цифры файла находятся в диапазоне от 10 до 29 лет или ...)

(DT_I4)(LEFT(@[User::CurrentFile],2)) >= 10 && (DT_I4)(LEFT(@[User::CurrentFile],2)) <= 29 ? "C:\\ARCHIVE\\AAA\\" : (DT_I4)(LEFT(@[User::CurrentFile],2)) >= 30 && (DT_I4)(LEFT(@[User::CurrentFile],2)) <= 59 ? "C:\\ARCHIVE\\BBB\\" : (DT_I4)(LEFT(@[User::CurrentFile],2)) >= 60 && (DT_I4)(LEFT(@[User::CurrentFile],2)) <= 99 ? "C:\\ARCHIVE\\CCC\\" : (DT_WSTR, 2)(LEFT(@[User::CurrentFile],2)) == "00" ? "C:\\ARCHIVE\\CCC\\" : "" 

предполагающей, что @ [User :: CurrentFile] содержит только имя файла, например, 12345678.txt; в последнем случае я рассмотрел значения> = 60 и < = 99 или == "00" (понимается как строка для двойного нуля).

Это выражение должно быть добавлено к глобальной переменной; переменная будет выбрана в Задаче Файловой системы, такой как «пункт назначения».

Выражение не проверяет, являются ли два символа целыми числами, для этой задачи мы должны добавить еще один элемент управления.

Я надеюсь, что эта помощь.

+0

Это ставит меня в правильном направлении, это точно. Но когда первый «случай» установлен в значение: C: \\ ARCHIVE \ AAA, он удерживает это значение в целевой переменной и помещает все файлы в этот каталог. Рядом с тем, что (DT_I4) дает ошибку кастинга на @ [User :: CurrentFile]. Даже если по причинам тестирования я помещаю только 3 файла в каталог TEMP (10000000.txt, 35000000.txt и 65000000.txt) – Barturion

+0

Можете ли вы проверить значение CurrentFile, переданное внутри цикла? –

+0

Спасибо, что Алекс действительно был проблемом. В производственном коде сетевой путь включал два «\\». Поэтому я сделал другую переменную (FileName), чтобы извлечь их. RIGHT (@ [User :: CurrentFile], FINDSTRING (REVERSE (@ [User :: CurrentFile]), "\\", 1) -1). Я использовал эту переменную в выражении, в котором вы мне помогли: ((DT_I4) LEFT (@ [User :: FIleName], 2)) <= 35? @ [Пользователь :: AAADestination]: @ [Пользователь :: BBBDestination]. Последний отрезанный - это всего лишь часть всего выражения, но вы знаете, что я имею в виду. Еще раз спасибо! – Barturion