Источник данных служб SSIS Excel - возможно ли переопределить типы данных столбца? - PullRequest
18 голосов
/ 12 февраля 2009

Когда в службах SSIS используется источник данных Excel, типы данных каждого отдельного столбца определяются на основе данных в столбцах. Можно ли переопределить это поведение?

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

В настоящее время вкладка «Вывод ошибок» может использоваться для игнорирования сбоев преобразования - тогда рассматриваемые данные будут нулевыми, и пакет продолжит выполнение. Однако мы хотим знать, какими были исходные данные, чтобы сгенерировать соответствующее сообщение об ошибке для этой строки.

Ответы [ 8 ]

10 голосов
/ 12 февраля 2009

Да, вы можете. Просто зайдите в список выходных столбцов в источнике Excel и установите тип для каждого из столбцов.

Чтобы попасть в список входных столбцов, щелкните правой кнопкой мыши источник Excel, выберите «Показать расширенный редактор», перейдите на вкладку с надписью «Свойства ввода и вывода».

Потенциально лучшим решением является использование компонента производного столбца, в котором вы можете фактически создать «новые» столбцы для каждого столбца в Excel. Это имеет преимущества

  1. У вас больше контроля над тем, во что вы конвертируетесь.
  2. Вы можете добавить правила, управляющие изменением (т. Е. Если пустое значение даст мне пустую строку, но если есть данные, то укажите данные в виде строки)
  3. Ваш источник данных не привязан напрямую к остальной части процесса (т. Е. Вы можете изменить источник, и единственное место, где вам нужно будет работать, находится в производном столбце)
9 голосов
/ 13 августа 2014

Согласно этой записи в блоге проблема заключается в том, что драйвер SSIS Excel определяет тип данных для каждого столбца на основе значений чтения первых 8 строк:

  • Если 8 верхних записей содержат одинаковое количество числовых и символьных типов - приоритет имеет числовое значение
  • Если большинство из топ-8 записей являются числовыми, тогда тип данных присваивается как числовой, а все символьные значения читаются как NULL
  • Если большинство из топ-8 записей имеют символьный тип, тогда тип данных назначается в виде строки, а все числовые значения читаются как * 1011 значения NULL *

В посте изложены две вещи, которые вы можете сделать, чтобы это исправить:

  1. Сначала добавьте IMEX=1 в конец строки подключения драйвера Excel. Это позволит Excel читать значения как Unicode. Однако этого недостаточно, если данные в первых 8 строках являются числовыми.
  2. В реестре измените значение для HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Nod\Microsoft\Jet\4.0\Engines\Excel\TypeGuessRows на 0. Это гарантирует, что драйвер просматривает все строки, чтобы определить тип данных для столбца.
7 голосов
/ 23 сентября 2009

Если ваш файл Excel содержит число в рассматриваемом столбце в первой строке данных, похоже, что механизм служб SSIS сбросит тип в числовой тип. Это продолжало сбрасывать мой. Я вошел в свой файл Excel и изменил числа на «Числа, хранящиеся в виде текста», поместив перед ними одну кавычку. Теперь они читаются как текст.

Я также заметил, что SSIS использует первую строку для IGNORE, что указывает программист на действительный тип данных (я даже сказал Excel отформатировать весь столбец как TEXT, но SSIS все еще использовал данные, что было кучей цифр), и сбросьте его. Как только я исправил это, поместив в файл Excel одиночную кавычку перед числом в первой строке данных, я подумал, что это будет правильно, но нет, есть дополнительная работа.

На самом деле, хотя столбец внешнего источника данных служб SSIS теперь имеет тип DT_WSTR, он все равно будет считать 43567192 как 4.35671E + 007. Поэтому вам нужно вернуться в файл Excel и поставить одинарные кавычки перед всеми числами.

Довольно LAME, Microsoft! Но есть ваше решение. Я понятия не имею, что делать, если файл Excel не находится под вашим контролем.

2 голосов
/ 18 августа 2017

Я искал решение для подобной проблемы, но ничего не нашел в интернете. Хотя большинство найденных решений работают во время разработки, они не работают, когда вы хотите автоматизировать свой пакет служб SSIS.

Я решил проблему и заставил ее работать, изменив свойства «Excel Source». По умолчанию для свойства AccessMode установлено значение OpenRowSet. Если вы измените его на SQL Command, вы можете написать свой собственный SQL для преобразования любого столбца по своему усмотрению.

Для меня SSIS рассматривал столбец NDCCode как число с плавающей точкой, но мне нужно было это как строку, и поэтому я использовал следующий SQL:

Select [Site], Cstr([NDCCode]) as NDCCode From [Sheet1$]

enter image description here

enter image description here

2 голосов
/ 01 марта 2014

Источник в Excel - SSIS ведет себя сумасшедшим. Служба SSIS определяет тип данных в определенном столбце, читая первые 10 строк. Отсюда и проблема. Если у вас есть текстовый столбец с нулевыми значениями в первых 10 столбах, SSIS принимает тип данных как Int. Немного борьбы, вот обходной путь

  1. Вставьте фиктивный ряд (предпочтительно первый ряд) в лист. Я предпочитаю делать это через задачу «Сценарий», вы можете рассмотреть возможность использования какой-либо службы для предварительной обработки файла перед подключением к нему служб SSIS

  2. В строке думими вы уверены, что типы данных будут установлены так, как вам нужно

  3. Считайте данные с использованием источника Excel и отфильтруйте фиктивную строку перед тем, как принять ее для дальнейшей обработки.

Я знаю, что это немного потертый, но это работает :)

0 голосов
/ 26 июня 2014

Я мог бы решить эту проблему. при создании пакета служб SSIS я вручную изменил определенный столбец на текст (откройте файл Excel, выберите столбец, щелкните правой кнопкой мыши столбец, выберите ячейки формата, на вкладке с цифрами выберите «Текст» и сохраните Excel). Теперь создайте пакет служб SSIS и протестируйте его. Оно работает. Теперь попробуйте использовать файл Excel, где этот столбец не был задан как текст.

Это сработало для меня, и я мог успешно выполнить пакет.

0 голосов
/ 14 января 2014

У меня были проблемы с реализацией решения здесь - я мог следовать инструкциям, но он только выдал новые ошибки.

Я решил свои проблемы с преобразованием, используя сущность преобразования данных. Это можно найти на панели инструментов служб SSIS в разделе Преобразования потока данных. Я поместил преобразование данных между моим источником Excel и назначением OLE DB, связал Excel с данными C, данные C с OLE DB, дважды щелкнул Data C, чтобы открыть список столбцов данных. Дали столбцу проблемы новый псевдоним и изменили столбец типа данных.

Наконец, в сопоставлениях адресата OLE DB используйте имя столбца псевдонима, а не исходное имя столбца Excel. Работа выполнена.

0 голосов
/ 31 марта 2012

Компонент преобразования данных можно использовать для преобразования в нужные типы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...