Недопустимое значение символа для ошибки спецификации приведения произошло при сопоставлении столбца типа DT_DBTIMESTAMP2 с datetime2 в SQL Server - PullRequest
0 голосов
/ 24 февраля 2019

Я создаю пакет служб SSIS для импорта файла CSV в таблицу.В настоящее время я импортирую плоский файл, создаю производный столбец, выполняю преобразование данных и затем загружаю его в БД.

Поток данных пакета

Package Data Flow

Проблема, с которой я сталкиваюсь при попытке преобразовать столбец типа DT_DBTIMESTAMP2 в datetime2, приводит к следующей ошибке:

[Назначение OLE DB [78]] Ошибка: код ошибки служб SSIS DTS_E_OLEDBERROR.Произошла ошибка OLE DB.Код ошибки: 0x80004005.
Доступна запись OLE DB.Источник: «Поставщик Microsoft OLE DB для SQL Server». Hresult: 0x80004005 Описание: «Недопустимое символьное значение для спецификации приведения.».
Доступна запись OLE DB.Источник: «Поставщик Microsoft OLE DB для SQL Server». Результат: 0x80004005 Описание: «Недопустимое символьное значение для спецификации приведения.».

формат моих данных:

20-NOV-18 06.09.43.928460000 PM

В моем производном столбце я использую следующее выражение, которое, по-видимому, дает мне искомый результат:

"20" + SUBSTRING(DSTAMP,8,2) + "-" + 
    (SUBSTRING(DSTAMP,4,3) == "JAN" ? "01" : 
     SUBSTRING(DSTAMP,4,3) == "FEB" ? "02" : 
     SUBSTRING(DSTAMP,4,3) == "MAR" ? "03" : 
     SUBSTRING(DSTAMP,4,3) == "APR" ? "04" : 
     SUBSTRING(DSTAMP,4,3) == "MAY" ? "05" : 
     SUBSTRING(DSTAMP,4,3) == "JUN" ? "06" : 
     SUBSTRING(DSTAMP,4,3) == "JUL" ? "07" : 
     SUBSTRING(DSTAMP,4,3) == "AUG" ? "08" : 
     SUBSTRING(DSTAMP,4,3) == "SEP" ? "09" : 
     SUBSTRING(DSTAMP,4,3) == "OCT" ? "10" : 
     SUBSTRING(DSTAMP,4,3) == "NOV" ? "11" : 
     SUBSTRING(DSTAMP,4,3) == "DEC" ? "12" : " ") 
+ "-" + LEFT(DSTAMP,2) + " " + SUBSTRING(DSTAMP,11,2) + ":" +
SUBSTRING(DSTAMP,14,2) + ":" + SUBSTRING(DSTAMP,17,2) + "." +
SUBSTRING(DSTAMP,20,7)

Я настроил средство просмотра данных, и оно, похоже, дает мне желаемый результат:

Вывод средства просмотра данных

Data Viewer Output

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

Я очистил входной файл в поисках аномалий, и все строки верны.

полагал, что другой набор глаз может помочь, любые предложения с благодарностью!

1 Ответ

0 голосов
/ 24 февраля 2019

Попробуйте привести к (DT_DBTIMESTAMP2) внутри производного столбца:

(BT_DBTIMESTAMP2)("20" + SUBSTRING(DSTAMP,8,2) + "-" + 
(SUBSTRING(DSTAMP,4,3) == "JAN" ? "01" : 
 SUBSTRING(DSTAMP,4,3) == "FEB" ? "02" : 
 SUBSTRING(DSTAMP,4,3) == "MAR" ? "03" : 
 SUBSTRING(DSTAMP,4,3) == "APR" ? "04" : 
 SUBSTRING(DSTAMP,4,3) == "MAY" ? "05" : 
 SUBSTRING(DSTAMP,4,3) == "JUN" ? "06" : 
 SUBSTRING(DSTAMP,4,3) == "JUL" ? "07" : 
 SUBSTRING(DSTAMP,4,3) == "AUG" ? "08" : 
 SUBSTRING(DSTAMP,4,3) == "SEP" ? "09" : 
 SUBSTRING(DSTAMP,4,3) == "OCT" ? "10" : 
 SUBSTRING(DSTAMP,4,3) == "NOV" ? "11" : 
 SUBSTRING(DSTAMP,4,3) == "DEC" ? "12" : " ") 
 + "-" + LEFT(DSTAMP,2) + " " + SUBSTRING(DSTAMP,11,2) + ":" +
SUBSTRING(DSTAMP,14,2) + ":" + SUBSTRING(DSTAMP,17,2) + "." +
SUBSTRING(DSTAMP,20,7))
...