Импорт служб SSIS из Excel в проблемы усечения SQL

Я использую SSIS 2012 и SQL Server 2014. У меня всегда была эта проблема, и я ЕЩЕ не видел жизнеспособного решения, и я не уверен, почему больше людей не сталкиваются с этой проблемой. Вот моя простая задача потока данных:

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

Я получаю многочисленные файлы Excel от клиентов. Проблема в том, что некоторые поля содержат текст, длина которого превышает 255 символов, а, как мы все знаем, Microsoft НЕ достаточно умна, чтобы читать все строки (читаются первые 8 записей и предполагается, что если первые 8 строк меньше 255 символов). символов, то ВСЕ строки должны быть меньше 255).

Конечно, это приводит к ошибкам усечения. Даже если я установлю для столбца назначения SQL значение nvarchar(max), SSIS все равно выдаст ошибку. Я уверен, что многие сталкивались с этой ошибкой, просто используя SSMS и импортируя файл Excel вручную. Для моего пакета SSIS у меня есть задача преобразования данных, которая предположительно преобразует исходные данные в формат, который затем можно перенести в SQL Server. Очевидно нет.

Вот моя простая задача потока данных с выделенным столбцом-нарушителем:

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

Итак, ограниченные решения, которые я нашел в Интернете, рекомендуют сортировать данные так, чтобы самое широкое текстовое значение находилось вверху, чтобы SQL Server мог его прочитать. Я не могу делать это для сотен файлов каждый раз. И мне нужны данные в исходном порядке сортировки, так что это нецелесообразно. Или я должен вставить фиктивную запись в качестве первой строки в файле Excel.

А как это сделать - в скриптовой задаче? Опять же, более сотни файлов? Я также слышал, что могу как-то изменить реестр. Хочу ли я возиться с этим? Что-нибудь из этого звучит практично?

Я не видел в Интернете ничего, что можно было бы сравнить с моей ситуацией, и я в замешательстве. Как это может быть? Я не могу быть единственным, кто сталкивается с такими проблемами усечения.

В любом случае, я ценю любую помощь.


person Craig    schedule 11.11.2018    source источник
comment
Я начал использовать EPPlus + Powershell, потому что эта проблема (и связанные с ней проблемы) существует всегда и никогда не решалась. Другая проблема, с которой я столкнулся, заключается в том, что в зависимости от этих данных в конкретном файле длина данных может измениться, что означает, что тип данных, сообщаемый драйвером excel, изменяется во время выполнения (т. е. с символа на заметку), а затем ваш пакет SSIS ломается. .   -  person Nick.McDermaid    schedule 19.03.2021


Ответы (3)


Возможные решения:

1- Измените размер выборки, обновив TypeGuessRows в разделе реестра для HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel. Путь может быть не совсем таким же на вашей машине, но будет похожим.

2- Используйте Flat File Connection Manager вместо Excel Connection Manager, щелкните правой кнопкой мыши, перейдите в «Расширенный редактор», перейдите на вкладку «Свойства ввода и вывода», найдите свой столбец слева в разделе «Выходные столбцы» и установите его длину на 1000.

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

person Eray Balkanli    schedule 11.11.2018
comment
диспетчер соединений с плоскими файлами - для файла EXCEL??! Как это должно работать? Я попытался подключиться к исходному файлу Excel, но редактор даже не смог распознать ни одного столбца. Не могли бы вы сделать резервную копию шага и показать/посоветовать, как это работает? Спасибо. - person Craig; 11.11.2018
comment
Я думаю, вы можете сначала преобразовать excel в csv. - person Eray Balkanli; 11.11.2018
comment
Опять же, для потенциально сотен файлов? Что делать, если данные содержат запятые? Я ценю помощь, но мой опыт работы с файлами CSV был еще более кошмарным. - person Craig; 11.11.2018
comment
CSV с соответствующим разделителем (табуляция, ~, |) довольно надежен, но основная проблема заключается в том, что excel является ненадежным форматом обмена данными, и я согласен, что обычно нецелесообразно надежно конвертировать кучу excel в CSV. Хотя это можно сделать, у вас просто возникла та же проблема, когда вы пытаетесь распознать типы данных Excel. - person Nick.McDermaid; 19.03.2021

В результате моего собственного недовольства неадекватной диагностикой типов данных в импортированных данных в SSMS я написал вместо этого инструмент, выполняющий эту работу. Это работает лучше для меня; это может сработать лучше для вас, если вы открыты для сценариев за пределами среды Microsoft. Инструмент представляет собой сценарий Python, доступный по адресу https://pypi.org/project/execsql/. . Команда IMPORT прочитает весь файл Excel или CSV, чтобы определить данные типов, что в значительной степени гарантирует, что данные будут успешно импортированы. Импорт из CSV намного быстрее, чем импорт из Excel, а разрывы строк внутри столбцов CSV-файла обрабатываются правильно.

person rd_nielsen    schedule 11.11.2018
comment
Спасибо. я изучу этот вариант. - person Craig; 12.11.2018
comment
Мне было бы интересно узнать, что xlrd использует для чтения Excel. Поскольку .xls является проприетарным, я предполагаю, что в конце концов он просто использует драйвер JET? - person Nick.McDermaid; 21.03.2021
comment
@ Nick.McDermaid - JET не используется. Формат файлов Excel был переработан много лет назад. xlrd и другие библиотеки могут читать файлы Excel в системах без установленной JET. - person rd_nielsen; 21.03.2021
comment
Ой! Это интересно знать! - person Nick.McDermaid; 21.03.2021

Я использовал формулу =rept(x,4000) в первой строке листа Excel, во всех столбцах (или во всех столбцах большого размера). Затем я вставил значения. Затем сопоставление столбцов правильно интерпретировало столбец как nvarchar(max). После импорта я удалил первую запись.

Хотя я использовал 4000, он правильно импортировал ячейки, которые были намного больше 4000. Каким-то образом 4000 было достаточно большим, чтобы выбрать Max в качестве размера поля.

(Затем я проверил, будет ли работать ввод слова max в сопоставлении для размера поля. Он принимает это и создает вывод как nvarchar (max), но все же усекает ввод до 255, поэтому необходимо добавить эту первую запись, как описано . Это работает.)

person pghcpa    schedule 19.03.2021