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

у меня есть файл 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]] ошибка: была ошибка с входным столбцом ""CYCLE_DATE"" (874) на входе "Оле ДБ назначения входного сигнала" (773). Возвращаемое состояние столбца: "значение не может быть преобразовано из-за потенциальной потери данных.".

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

3 ответов


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

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

Orders file

создал простую таблицу с именем 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 это диспетчер соединений с неструктурированными файлами.

Connections

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

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

Flat File General

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

Flat File Columns

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

Advanced column OrderNumber

изменить имя столбца из Столбец1 to OrderDate а также изменил тип данных на date [DT_DATE]

Advanced column OrderDate

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

Data Preview

на Control Flow вкладка пакета служб SSIS, помещенная Data Flow Task.

Control Flow

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

Data Flow Task

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

Flat File Source Connection Manager

Flat File Source Columns

Flat File Source Error Output

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

OLE DB Destination Connection Manager

OLE DB Destination Mappings

OLE DB Destination Error Output

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

Right click

Data Flow Path Editor New

Configure Data Viewer

Data Flow Path Editor Added

Data Viewer visible

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

Empty Table

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

Data Viewer Pause

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

Successful execution

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

Data in table

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

Destination layout

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


в конечном итоге я смог решить проблему, установив тип столбца в соединении с плоским файлом типа " дата базы данных [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. Это означает точность миллисекунд с точностью до каждой третьей миллисекунды (гггг-мм-ддтг: Ми: СС.mmL, где L может быть 0,3 или 7).

решение изменить дату CYCLE_DATE типа в datetime2 - DT_DBTIME2.