Как исправить «неверное значение символа для спецификации приведения» в столбце даты в плоском файле? - PullRequest
11 голосов
/ 02 сентября 2011

У меня есть файл 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) на входе "Вход назначения OLE DB" (773). Возвращено состояние столбца: «Не удалось преобразовать значение из-за потенциальной потери данных.».

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

Ответы [ 3 ]

40 голосов
/ 03 сентября 2011

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

Создан простой файл CSV с двумя столбцами, а именно номер заказа и дата заказа. Как вы уже упоминали в своем вопросе, значения обоих столбцов указываются в двойных кавычках ("), а также строки заканчиваются переводом строки (\ 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

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

Advanced column OrderNumber

Изменено имя столбца с Столбец1 на 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 имеет тип данных date , и пакет все еще продолжал корректно вставлять данные.

Destination layout

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

20 голосов
/ 06 сентября 2011

В конечном итоге я смог найти решение, установив тип столбца в подключении к плоскому файлу типа «дата базы данных [DT_DBDATE]» *

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

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

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

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

При изменении типа столбца на DT_DBDATE проблема была решена - я подключил средство просмотра данных, и значение CYCLE_DATE былотеперь просто "20.12.2010" без компонента времени, который, по-видимому, решил проблему.

0 голосов
/ 03 сентября 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...