2009-02-12 5 views
16

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

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

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

+0

Я ответил один вопрос в другой теме, похожей на ваш, см. ссылку ниже. http://dba.stackexchange.com/questions/39252/ssis-keeps-force-changing-excel-source-string-to-float/149378#149378 – user1968485

ответ

8

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

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

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

  1. У вас есть больше контроля над тем, что вы конвертируете в.
  2. Вы можете ввести правила, которые управляют изменением (т. Е. Если null дает мне пустую строку, но если есть данные, тогда дайте мне данные в виде строки)
  3. Ваш источник данных не привязан непосредственно к остальной части процесс (т. е. вы можете изменить источник, и единственное место, которое вам нужно будет выполнить, - это производная колонка)
+0

Роберт - Спасибо за ваш ответ - у меня все еще есть проблема смотри как сделать это. Я использую компонент Excel Source, который имеет форму столбцов, но это только имя каждого столбца, а не тип данных. Насколько мне известно, диспетчер подключений Excel не имеет формы столбцов. –

+0

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

+7

Как добраться сейчас - я использовал расширенный редактор и изменил входные и выходные столбцы для всех типов данных DT_WSTR. Однако типы данных столбца вывода ошибок должны соответствовать типам данных входных столбцов, и это не представляется возможным изменить их ... Спасибо за вашу постоянную помощь! –

7

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

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

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

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

-2

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

+2

Если SSIS в своей бесконечной мудрости решает, что столбец является числовым, чтение текстовых значений приведет к сбою источника данных. Нет возможности конвертировать данные вниз по течению. – 2015-12-29 15:49:48

-1

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

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

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

+0

Похоже, вы забыли связаться с решением вашей ссылки – Ethan

+0

Это разработка предложения Farouq от двух лет назад и имеет ту же проблему. – 2015-12-29 15:50:38

+0

Да, это была разработка - показать все шаги, необходимые для того, чтобы процесс работал - и это действительно сработало. Вы попробовали это, прежде чем решить, что это было неправильно, и потребовалось понизить голос? – kangacHASHam

2

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

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

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

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

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

0

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

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

8

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

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

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

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

Я искал решение по аналогичной проблеме, но ничего не нашел в Интернете. Хотя большинство найденных решений работают во время разработки, они не работают, когда вы хотите автоматизировать свой пакет 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

+0

Я поддерживаю, потому что теоретически это решение может работать. Я попробовал, но Windows 8 + Visual Studio 2017 + последние BIDS рушится каждый раз, когда я добираюсь до определенного момента с ним. Поэтому я не могу точно сказать – EGP