#ssis
Вопрос:
У меня есть сторонний файл в кодировке utf — 8, 56 столбцов, экспорт csv из MySQL. Мое намерение состоит в том, чтобы загрузить его в экземпляр Sql Server 2019 — макет таблицы, который я не могу контролировать.
Мастер импорта Sql Server автоматически выполнит преобразование кодовой страницы в латинский 1 (и пару преобразований строки в int), но он не будет обрабатывать MySQL «N» для соглашений о нуле, поэтому я решил попробовать свои силы в службах SSIS, чтобы посмотреть, смогу ли я очистить данные при приеме.
У меня есть ряд компонентов, настроенных для выполнения различной фильтрации и преобразования (например, «N»), и все это работало нормально. Затем я попытался сохранить данные, используя пункт назначения OLE DB, и колеса как бы отвалились от тележки.
Службы SSIS, похоже, отбрасывают все действия мастера импорта автоматических преобразований и заставляют вас делать преобразования явными.
Я добавляю компонент преобразования данных в поток и редактирую все 56 столбцов, чтобы четко указать различные преобразования — только это позволяет мне редактировать «Копию» кодовых страниц выходных столбцов, они не будут сохранены. Либо в редакторе, либо в Расширенном редакторе.
Я видел здесь еще одну статью, в которой говорится «Используйте преобразование производных столбцов», но, похоже, это делается по столбцам (поэтому мне пришлось бы добавить 56 из них).
Кажется немного сумасшедшим, что SSIS-это такой важный шаг назад в этом отношении по сравнению с Мастером импорта, bcp или МАССОВОЙ ВСТАВКОЙ.
Есть ли способ заставить его работать с помощью переключателя кодовой страницы в SSIS с использованием компонентов SSIS? Все компоненты, которые я рекомендовал, похоже, не работают, и во всех других статьях говорится: «создайте еще одну таблицу, используя разные кодовые страницы или NVARCHAR, а затем скопируйте одну таблицу в другую», что как бы противоречит цели.
Ответ №1:
Потребовалось синтезировать несколько различных сообщений по вопросам, связанным с касательными, но я думаю, что наконец-то получил SSIS, чтобы сделать многое из того, что Мастер импорта и МАССОВАЯ ВСТАВКА давали бесплатно.
Похоже, что чтение csv-файла utf-8 с помощью SSIS и его обработка вплоть до таблицы 1252 года без использования NVARCHAR включает в себя следующее:
- Создайте компонент источника плоского файла и установите входящую кодировку 65001 (utf-8). В расширенном редакторе преобразуйте все строковые столбцы из DT_STR/65001 в DT_WSTR (по сути, NVARCHAR). С этими выходными данными проще работать на протяжении всего рабочего процесса, и (что наиболее важно) компонент преобразования преобразования данных не позволит вам конвертировать данные с 65001 на любую другую кодовую страницу. Но это позволит вам преобразовать DT_WSTR в DT_STR на другой кодовой странице.
1a) SSIS довольно раздражает то, что по умолчанию для всего по умолчанию устанавливается длина 50. И не переносить какие-либо длины по умолчанию от одного компонента/преобразования к другому. Поэтому вам нужно пройти и установить соответствующие длины для всех входных столбцов «Столбец 0» из источника неструктурированного файла и всех преобразований WSTR, которые вы создаете в этом компоненте.
1b) Если ваш входной файл содержит, как, по-видимому, и мой, недопустимую кодировку utf-8 время от времени, выберите «RD_RedirectRow» в качестве обработки ошибок усечения для каждого столбца. Затем добавьте пункт назначения плоского файла в свой рабочий процесс и прикрепите к нему красную линию, выходящую из источника плоского файла. Это если вы хотите посмотреть, какой скандал был плохим. Вы можете просто выбрать «RD_IgnoreError», если вас не волнует неправильный ввод. Но если оставить значение по умолчанию, это означает, что весь ваш пакет взорвется, если он попадет в какие-либо неверные данные
- Создайте компонент преобразования сценария, и в этом сценарии вы можете проверить каждый столбец MySQL на наличие «N» и изменить его на null.
- Создайте компонент преобразования преобразования данных и добавьте его в свой рабочий процесс. Из-за DT_WSTR на шаге 1 теперь вы можете изменить этот вывод обратно на DT_STR на другой кодовой странице здесь. Если вы не перейдете на DT_WSTR с самого начала, компонент преобразования данных не будет работать, изменяя кодовую страницу на этом шаге. 99% данных, которые я получаю, содержат только латинские символы в кодировке utf-8 (акценты). В небольшом подмножестве данных есть небольшое количество символов кандзи, поэтому, чтобы воспроизвести действия мастера импорта, вы должны изменить обработку ошибок усечения для каждого столбца, на который может повлиять ошибка RD_IgnoreError. В отличие от некоторых документов, которые я читал, RD_IgnoreError не помещает значение null в столбец; он помещает текст с символами, не соответствующими отображению, замененными на»?», как мы все привыкли.
- Добавьте целевой компонент OLE DB и сопоставьте все выходные столбцы с шага 3 со столбцами базы данных.
Итак, много работы, чтобы вернуться к работе Мастера импорта и начать получать дополнительные услуги, которые службы SSIS могут для вас сделать. И службы SSIS могут быть немного раздражающими из-за привязки ширины столбцов к 50 по умолчанию, когда вы что-то меняете. Если у вас много колонок, это может стать довольно утомительным.