Выполнять разные пакеты SSIS на основе имени плоского файла

У меня есть несколько пакетов SSIS, которые анализируют разные файлы в соответствующие таблицы. Используя задачу SSIS File Watcher, я хочу создать главный пакет, который будет проверять папку на наличие файлов, а затем выбирать соответствующий подпакет на основе OutputVariableName с использованием ограничения приоритета. Я не уверен, как написать выражение для правильной установки переменной. Я хочу установить его на основе FINDSTRING () в имени файла.


person RagePwn    schedule 19.09.2013    source источник


Ответы (1)


Ваш вопрос касается использования задачи отслеживания файлов от Konesans в пакеты интеграционных услуг.

OutputVariableName String Имя переменной, в которую будет записан полный путь к найденному файлу после завершения задачи. Указанная переменная должна быть строкового типа

Через http://www.sqlis.com/post/file-watcher-task.aspx

Создайте переменную SSIS на уровне пакета с именем CurrentFileName. Настройте File Watcher Task так, чтобы свойство OutputVariableName было User::CurrentFileName. Когда вы перетаскиваете файл в папку, за которой наблюдает задача, он назначит полный путь к этой переменной CurrentFileName.

Вы хотите сделать что-нибудь с этой переменной с помощью функции FindString, чтобы определить запускаемый пакет. Поскольку вы не указываете something, я предполагаю, что это основано на имени файла.

Жаль, что вы заставляете человека использовать FindString для выполнения этой задачи. Я говорю это, потому что библиотека .NET предлагает отличный статический метод для определения имен базовых файлов, и я ненавижу, когда люди заново изобретают (и отлаживают) колесо.

Я бы создал 3 переменных, чтобы поддержать это начинание.

  • BaseFileName - String - Оценить как Expression = True
  • FileExtensionPosition - Int32 - Оценить как Expression = True
  • LastSlashPosition - Int32 - Оценить как Expression = True

LastSlashPosition будет использовать FindString для определения последнего появления \ в строке. FileExtensionPosition будет определять последнее появление . в строке. BaseFileName будет использовать эти числа, чтобы вычислить, где разрезать строку @ [User :: CurrentFileName] `.

Ленивый трюк, который я использую для поиска последнего X в строке, - это перевернуть его. Затем это первый элемент в строке, и я могу передать 1 в качестве последнего параметра FindString.

Выражение, присвоенное @ [User :: LastSlashPosition]:

FINDSTRING(REVERSE(@[User::CurrentFileName]), "\\", 1)

Выражение, присвоенное @ [User :: FileExtensionPosition]:

FINDSTRING(REVERSE(@[User::CurrentFileName]), ".", 1)

Выражение, присвоенное @ [User :: BaseFileName], затем становится

SUBSTRING((RIGHT(@[User::CurrentFileName], @[User::LastSlashPosition] -1 )), 1, LEN(RIGHT( @[User::CurrentFileName], @[User::LastSlashPosition] -1)) - @[User::FileExtensionPosition] )

Разбивая это на части, (RIGHT(@[User::CurrentFileName], @[User::LastSlashPosition] -1 )) переводится как базовое имя файла. Если CurrentFileName равно J: \ ssisdata \ so \ FileWatcher \ CleverFile.txt, тогда это оценивается как "CleverFile.txt" I подстрока, которая убирает конец. Вы можете сократить это до одной операции с подстрокой, но у меня так поздно болит мозг.

Теперь вы пытаетесь использовать, я полагаю, серию задач «Выполнение пакета», основанных на ограничении приоритета успеха и @[User::BaseFilename] == "SubPackage1. Вы можете сделать это, и он будет работать нормально, просто вам нужно будет настроить каждую из них и как вы идете заводить нового ребенка, вам придется повторить работу.

В качестве альтернативы этому подходу я бы использовал перечислитель ForEach и определил бы там все свои пары ключ-значение.

введите описание изображения здесь

Столбец 0 - это значение, которое может оценивать BaseFileName.

Столбец 1 - это пакет SSIS, который я хочу запустить в ответ.

Я создал две переменные для поддержки этого и настроил их как таковые

введите описание изображения здесь

Мой полученный пакет выглядит как

введите описание изображения здесь

Не показана задача File Watcher, потому что у меня нет желания устанавливать ее на моем компьютере. Предположим, что он подключается к циклу ForEach.

Цикл ForEach перебирает пары ключ-значение, показанные выше. Задача сценария внутри контейнера предназначена только для того, чтобы обеспечить основу для работы ограничения приоритета. Я настраиваю ограничение приоритета как Успех и @[User::KeyName] == @[User::BaseFileName]

Затем я моделирую запуск задачи «Выполнить пакет» на основе этого. Фактическое имя пакета будет определяться значением @ [User :: KeyPackage]

И это ваше замысловатое решение на день;)

person billinkc    schedule 20.09.2013