вторник, 24 июля 2012 г.

Проблема с импортом плоского файла (flat file) в SSIS 2008

Задача: перенести несколько пакетов DTS (MSSQL 2000) на SSIS MSSQL 2008.
Учитывая то, что нормального мастера для переноса DTS пакетов в SSIS не существует, приходится такую работу делать вручную, т.е. строить новые пакеты с такой же функциональностью.

В пакете, который мне нужно было перенести, информация из текстового файла импортируется в таблицу базы данных. Импорт в DTS работает точно так же, как и импорт Excel - открываешь файл, указываешь разделители столбцов и строк, кодировку и тд и в результате получаешь нужные данные. По тому же пути пошел, когда начал создавать SSIS пакет: первым делом необходимо настроить Flat file connection. При настройке обнаружилось, что конекшн видит меньше столбцов чем есть на самом деле. Сначала я подумал, что механизм обрабатывает первую строку и на ее основании формирует описание столбцов. Но оказалось все по другому. Оказалось, что если в строке файла недостаточное количество разделителей (т.е. разное количество во всех строках), то импорт будет работать некорректно.

Пример строки (которую не поймет механизм SSIS):
1;1;1;
2;2;2;2;2
3;;3;3

Как должно быть (по мнению разработчиков импорта в SSIS)
1;1;1;;;
2;2;2;2;2;
3;;3;3;;

Для алгоритма импорта плоского файла в SSIS символ конца строки на самом деле не является таковым... это просто очередной разделитель. Такая вот засада :(

Вот ответ Microsoft на такую проблему: http://connect.microsoft.com/SQLServer/feedback/details/124478/flat-file-connection-manager-row-delimiter-property-does-not-work

Они там предлагают еще и смешное решение :)

Мое решение:
1. В данном случае все обошлось простым решением (я считаю, самым правильным) : я договорился с человеком, ответственным за импорт, что он дополнит все строки недостающими разделителями.
2. Можно сделать скрипт, который создает новый файл, в котором дополняет все строки недостающими разделителями
3. Можно в конекшне определить минимально возможное количество столбцов с информацией (для примера выше - 4) и тогда в последнем будут данные из нескольких последних столбцов, которые потом можно распарсить с помощью Derived Column.

2 комментария:

  1. Привет !
    А что, это - http://msdn.microsoft.com/ru-ru/library/ms143496%28v=sql.105%29.aspx
    таки здесь не работает ?
    Т.е. старый пакет при помощи мастера миграции в этом случае не перенесется ? Пакет вроде простой, судя по описанию, там только BCP из текстового файла и запись в базу, или.. ?

    ОтветитьУдалить
  2. С помощью мастера можно "нормально" переносить простые пакеты. Это такие, которые можно сделать с помощью мастера импорта-экспорта. Если же в DTS есть какие-то трансформации, то они не перенесутся. Есть всякие сторонние программы для импорта DTS в SSIS, но и они "не фонтан". Зачастую проще все сделать ручками от начала до конца.

    В моем случае в пакете есть специфические трансформации, функции на визуал бейсике... поэтому мастер не канает.

    ОтветитьУдалить