Как исправить "недопустимое значение символа для спецификации приведения" в столбце даты в плоском файле?
у меня есть файл 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 на скриншоте обозначает ленту.
создал простую таблицу с именем 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}
. Это изменение разделителя строк заголовка также отражается на разделе столбцы.
в разделе столбцы не было внесено никаких изменений.
изменено имя столбца с Column0 to OrderNumber
.
изменить имя столбца из Столбец1 to OrderDate
а также изменил тип данных на date [DT_DATE]
предварительный просмотр данных в диспетчере соединений с плоскими файлами выглядит хорошо.
на Control Flow
вкладка пакета служб SSIS, помещенная Data Flow Task
.
в задаче потока данных помещено Flat File Source
и OLE DB Destination
.
в Flat File Source
был настроен для чтения данных CSV-файла с помощью диспетчера соединений FlatFile. Ниже трех скриншотов показано, как был настроен компонент источника плоского файла.
на OLE DB Destination
компонент был настроен для приема данных из источника плоского файла и вставки их в таблицу базы данных SQL Server с именем dbo.Destination
. Ниже трех скриншотов показано, как компонент назначения OLE DB сконфигурированный.
используя шаги, упомянутые в приведенных ниже 5 скриншотах, я добавил средство просмотра данных в потоке между источником плоского файла и назначением OLE DB.
перед запуском пакета я проверил исходные данные, присутствующие в таблица. В настоящее время он пуст, потому что я создал его с помощью скрипта, предоставленного в начале этого сообщения.
выполнение пакета и выполнение пакета временно приостановлено для отображения данных, поступающих из источника плоского файла в Назначение OLE DB в средстве просмотра данных. Я нажал на кнопку "выполнить", чтобы продолжить выполнение.
пакет выполнен успешно.
данные источника плоского файла были успешно вставлены в таблицу dbo.Destination
.
вот макет таблицы dbo.Назначение. Как видите, поле OrderDate имеет тип данных дата и пакет все еще продолжал вставлять данные правильно.
этот пост, хотя и не является решением. Надеюсь поможет вам чтобы выяснить, где проблема может быть в вашем случае.
в конечном итоге я смог решить проблему, установив тип столбца в соединении с плоским файлом типа " дата базы данных [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.