SSIS генерирует ошибку «DTS_E_PRIMEOUTPUTFAILED» в потоке данных SSIS с источником Excel - PullRequest
1 голос
/ 26 марта 2019

Я разрабатываю процесс служб SSIS, который извлекает данные из файлов Excel и загружает их в базу данных SQL Server.

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

В случае дат я использую конструкцию cdate(f1) as f1 в операторе SQL (с изменением числа в соответствии со столбцом), чтобы не дать SSIS самостоятельно принять решение о формате даты.

Это обычно работает нормально.Однако в некоторых случаях выдается ошибка, когда я пытаюсь запустить процесс, и в данных содержится недопустимое значение:

[SSIS.Pipeline] Ошибка: код ошибки SSIS DTS_E_PRIMEOUTPUTFAILED.Метод PrimeOutput на My_Excel_Source возвратил код ошибки 0x80040E21.Компонент возвратил код ошибки, когда механизм конвейера вызвал PrimeOutput ().Значение кода ошибки определяется компонентом, но ошибка является фатальной, и конвейер перестал выполняться.Перед этим могут быть сообщения об ошибках с дополнительной информацией о сбое.

У меня нет других ошибок.

Когда я пытаюсь предварительно просмотреть результат из ExcelВ окне редактора исходного кода я получаю сетку данных с образцом данных, как и ожидалось.Когда есть недопустимые данные, отображается текст - это нормально.В других потоках данных возвращается значение «1899-12-30», и я могу делать с ним все, что захочу.

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

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

Я ожидаю, что компонент Excel Source вернет значение «1899-12-30», когда исходная ячейка содержитнедопустимое значение, а не сбой потока данных.

Спасибо, Дэвид

1 Ответ

0 голосов
/ 29 марта 2019

Если вы хотите, чтобы Excel управлял разбором даты, я бы попробовал несколько SQL-выражений в строке

CASE 
  WHEN IsDate(f1) THEN CDate(f1)
  ELSE NULL 
END AS f1

Таким образом, если f1 анализирует как дату, он преобразует его в Date, в противном случае он возвращает NULL. Если вы предпочитаете, замените NULL на любое значение, которое вы предпочитаете, например CDate('1899-12-30').

Без защиты IsDate коннектор Excel OLEDB делает то, что вы ему сказали - пытается привести выражение к дате и завершается неудачей.

Функциональность тестирования каждой ячейки, работает ли приведение и отображение текста в случае сбоя, является частью приложения Excel, а не соединителем Excel OLEDB. Поэтому нам нужно эмулировать это здесь, используя приведенное выше выражение CASE.

...