Как исправить "недопустимое значение символа для спецификации приведения" в столбце даты в плоском файле?



У меня есть CSV-файл с разделителем {LF} для каждой строки и столбцом даты в формате даты "12/20/2010" (включая кавычки)



Моим целевым столбцом является таблица базы данных SQL Server 2008 типа date (не datetime)



В моем Диспетчере соединений с плоскими файлами я настроил столбец даты как тип данныхdate [DT_DATE] С TextQualified установить значение true и разделитель столбца как {LF} (это последний столбец в каждой строке). У меня есть текстовый квалификатор, установленный на "



Когда я пытаюсь загрузить это в Назначение OLE, я получаю следующую ошибку




[TRN_DORPS [760]] ошибка: код ошибки SSIS DTS_E_OLEDBERROR. Произошла ошибка OLE DB. Код ошибки: 0x80004005.
Доступна запись OLE DB. Источник: "поставщик Microsoft OLE DB для SQL Server" Hresult: 0x80004005 описание: "недопустимое значение символа для спецификации приведения.".
[TRN_DORPS [760]] Error: произошла ошибка с входным столбцом ""CYCLE_DATE "" (874) на вход "вход назначения OLE DB" (773). Возвращенный статус столбца был следующим: "значение не может быть преобразовано из-за потенциальной потери данных.".




Если я подключаю средство просмотра данных, значение в конвейере будет 2010-12-20 00:00:00.0000000 - является ли эта временная составляющая причиной проблемы? Я пытаюсь удалить временную составляющую с помощью (DT_DATE)(DT_DBDATE)[CYCLE_DATE], но безрезультатно, поскольку она остается неизменной в конвейере

751   3  

3 ответов:

Чтобы смоделировать проблему, с которой вы столкнулись, я создал следующий пример, используя SSIS 2008 R2 с SQL Server 2008 R2 серверной частью. Этот пример основан на том, что я понял из вашего вопроса. Этот пример не дает решения, но он может помочь вам определить, где может быть проблема в вашем случае.

Создал простой CSV-файл с двумя столбцами, а именно номером заказа и датой заказа. Как вы уже упоминали в своем вопросе, значения обоих столбцов определяются двойными кавычками ( " ) и кроме того, строки заканчиваются строкой Feed (\n) с датой, являющейся последним столбцом. Приведенный ниже снимок экрана был сделан с помощьюNotepad++, который может отображать специальные символы в файле. Если на скриншоте обозначает перевод строки.

Файл порядка

Создал простую таблицу с именем dbo.Destination в базе данных SQL Server для заполнения данных CSV-файла с помощью пакета служб SSIS. Сценарий создания таблицы приведен ниже.

CREATE TABLE [dbo].[Destination](
    [OrderNumber] [varchar](50) NULL,
    [OrderDate] [date] NULL
) ON [PRIMARY]
GO

В пакете SSIS я создал два диспетчера соединений. SQLServer был создан с использованием подключения OLE DB для подключения к базе данных SQL Server. FlatFile - это диспетчер соединений с плоскими файлами.

Подключение

Диспетчер соединений с плоскими файлами был настроен для чтения CSV-файла, и настройки показаны ниже. Красные стрелки указывают на внесенные изменения.

Предоставил имя диспетчеру соединений с плоскими файлами. Перешел к расположению CSV-файла и выбрал путь к файлу. Ввел двойную кавычку (") в качестве квалификатора текста. Изменил разделитель строки заголовка с {CR}{LF} на {LF}. Это изменение разделителя строк заголовка также отражается на разделе столбцы.

Плоский Файл General

Никаких изменений в разделе "столбцы" сделано не было.

Столбцы Плоского Файла

Изменил имя столбца с Column0 на OrderNumber.

Расширенный порядковый номер столбца

Изменил имя столбца с Column1 на OrderDate , а также изменил тип данных на date [DT_DATE]

Расширенный порядок столбцов

Предварительный просмотр данные в диспетчере соединений с плоским файлом выглядят хорошо.

Предварительный Просмотр Данных

На вкладке Control Flow пакета SSIS разместите Data Flow Task.

поток управления

В задаче потока данных помещены a Flat File Source и an OLE DB Destination.

задача потока данных

Flat File Source был настроен для чтения данных CSV-файла с помощью диспетчера соединений FlatFile. Ниже три скриншота показывают, как компонент источника плоского файла был сконфигурированный.

Диспетчер Соединений С Источником Плоских Файлов

Столбцы Источника Плоского Файла

Неструктурированный Файл Для Вывода Ошибок

Компонент OLE DB Destination был настроен для приема данных из источника плоского файла и вставки их в таблицу базы данных SQL Server с именем dbo.Destination. Ниже три скриншота показывают, как был настроен компонент назначения OLE DB.

Диспетчер конечных соединений OLE DB

Сопоставления назначения OLE DB

Вывод ошибки назначения OLE DB

Используя шаги, упомянутые в приведенных ниже 5 скриншотах, я добавил средство просмотра данных о потоке между источником плоского файла и Назначение OLE DB.

Правый клик

Редактор Пути Потока Данных Новый

Настройка Средства Просмотра Данных

Редактор Пути Потока Данных

Данные видны зрителю

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

пустая таблица

Выполнил пакет, и выполнение пакета временно приостановилось для отображения данных, поступающих из источника плоского файла в Назначение OLE DB в средство просмотра данных. Я нажал на кнопку выполнить, чтобы продолжить выполнение.

Пауза Просмотра Данных

Пакет успешно выполнен.

Успешное выполнение

Исходные данные плоского файла были успешно вставлены в таблицу dbo.Destination.

Данные в таблице

Вот макет таблицы dbo.Место назначения. Как вы можете видеть, поле OrderDate имеет тип данных date и пакет все еще продолжает вставлять данные правильно.

Макет назначения

Этот пост, хотя и не является решением. Надеюсь, это поможет вам выяснить, где может быть проблема в вашем сценарии.

В конечном итоге я смог решить эту проблему, установив тип столбца в соединении с плоским файлом типа "database date [DT_DBDATE]"

По-видимому, различия между этими форматами дат заключаются в следующем:

DT_DATE Структура дат, состоящая из года, месяца, дня, и часа.

DT_DBDATE Структура дат, состоящая из года, месяца и дня.

DT_DBTIMESTAMP Структура временных меток, состоящая из года, месяца, часа, минуты, секунды, и дробь

Изменив тип столбца на DT_DBDATE, проблема была решена - я подключил Средство просмотра данных, и значение CYCLE_DATE теперь было просто "12/20/2010" без компонента времени, что, по-видимому, решило проблему.

Правильный тип данных для" 2010-12-20 00:00:00.0000000 " значение DATETIME2(7) / DT_DBTIME2 ().

Но используемый тип данных для поля CYCLE_DATE-DATETIME - DT_DATE. Это означает миллисекундную точность с точностью до каждой третьей миллисекунды (гггг-мм-ddThh: mi: ss.mmL, где L может быть 0,3 или 7).

Решение состоит в том, чтобы изменить тип даты CYCLE_DATE на DATETIME2-DT_DBTIME2.

Comments

    Ничего не найдено.