Службы SSIS от Excel до SQL Server: длина типа данных
У меня есть пакет служб SSIS (SQL Server 2008). У меня есть исходный файл Excel (XLS 97-2003), который я хочу сначала импортировать в таблицу SQL, в которой все хранится в виде строк (числа и даты хранятся так, как они написаны, например). Затем я беру данные из этой таблицы в другие мои таблицы.
Источник Excel настроен так: Provider=Microsoft.Jet.OLEDB.4.0;Data Source=*********;Extended Properties="EXCEL 8.0;HDR=YES;IMEX=1";
Моя проблема возникает на первом этапе. Позвольте мне объяснить: некоторые из моих столбцов МОГУТ содержать большой текст. Я точно знаю, что это за столбцы.
Проблема в том, что:
- С одной стороны, если исходные столбцы настроены как ntext, и если есть длинный текст (>255 символов), тогда OK. Если в этих столбцах отсутствуют данные, или короткий текст (<255 символов), или даже длинный текст после первых 8 строк, я получаю сообщение об ошибке (красное поле в источнике Excel... дальше не идет).
- С другой стороны, если исходные столбцы настроены на (wstr, 255) и если нет данных или коротких данных (<255 символов), все в порядке. Если текст большой, я получаю сообщение об ошибке (что кажется логичным).
Я хотел бы настроить свой пакет так, чтобы он не падал по ошибке, если источник данных содержит меньше данных, чем ожидалось. Мне кажется, что это вполне разумно, но я не могу этого достичь...
Любая помощь будет высоко ценится.
1 ответ
Согласно документации MSDN SSIS, вы должны прочитать эти два:
Недостающие ценности. Драйвер Excel считывает определенное количество строк (по умолчанию 8 строк) в указанном источнике, чтобы угадать тип данных каждого столбца... Для получения дополнительной информации см. PRB: Значения Excel, возвращаемые как NULL, с использованием DAO OpenRecordset.
Усеченный текст. Когда драйвер определяет, что столбец Excel содержит текстовые данные, драйвер выбирает тип данных (строка или памятка) на основе самого длинного значения, которое он выбирает. Если драйвер не обнаруживает никаких значений длиннее 255 символов в строках, которые он выбирает, он обрабатывает столбец как строковый столбец из 255 символов вместо столбца памятки. Поэтому значения длиннее 255 символов могут быть усечены. Чтобы импортировать данные из столбца памятки без усечения, необходимо убедиться, что столбец заметки хотя бы в одной из строк выборки содержит значение, превышающее 255 символов, или необходимо увеличить число строк, выбранных драйвером, чтобы включить такой ряд Вы можете увеличить количество выбранных строк, увеличив значение TypeGuessRows в разделе реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel. Для получения дополнительной информации см. PRB: передача данных из Jet 4.0 OLEDB Source Fails w/ Error.
Таким образом, кажется, что вы либо пытаетесь изменить исходную структуру Excel на лету (которая не работает с поставщиком Excel), либо у вас могут быть данные, которые не соответствуют перечисленным выше требованиям (т. Е. Длинный текст или длинный текст после 8 строк). Я полагаю, вы можете справиться с этим, используя два возможных метода:
- Вставить манекен
NTEXT
Размер данных в эти столбцы. Экономит много нервов. Вы можете сделать это для самой первой строки, поэтому поставщик Excel не будет разочарован после проверки содержимого столбца вообще. - Увеличьте настройку выборки строк, используя ссылку из MSDN. Который в любом случае потерпит неудачу, если у вас может не быть текста в этих столбцах.
PS. Третий способ - вообще не использовать поставщика Excel. Сохраните файл Excel в формате CSV и работайте с источником плоских файлов, эта проблема не вызовет у вас проблемы при работе с ним. Excel Source хорош только тогда, когда вы на 100% уверены, что исходный файл соответствует всем требованиям и никогда не изменит случайно свою структуру.