Почему выражение компонента «Производный столбец» не работает с пустым значением в службах SSIS? - PullRequest
3 голосов
/ 11 февраля 2020

Может кто-нибудь посоветовать мне, пожалуйста?

enter image description here

У меня есть таблица в SQL Сервер

create table t_test_date 
(
  tcol_date date, 
  tcol_varchar varchar(20), 
  tcol_date1 date
)

Когда я пытаюсь вставить данные из плоского файла с содержимым

COL_DATE
20-DEC-33
20-NOV-33
10-MAY-28
10-NOV-21

10-MAY-17
11-MAY-17
--(To Allow has empty values)

Значение выражения компонента производного столбца:

COL_DATE == "" || ISNULL(COL_DATE) ? NULL(DT_DBDATE) : (DT_DBDATE)COL_DATE

Я получил ошибку:

[Производный столбец [17]] Ошибка: код ошибки SSIS DTS_E_INDUCEDTRANSFORMFAILUREONERRORROR , «Производный столбец» не выполнен, так как произошел код ошибки 0xC0049063, а расположение строки ошибки в «Derived Column.Outputs [Вывод производного столбца] .Columns [COL_DATE]» указывает на ошибку при ошибке. Произошла ошибка в указанном объекте указанного компонента. Перед этим могут быть сообщения об ошибках с дополнительной информацией о сбое.

1 Ответ

1 голос
/ 11 февраля 2020

Причина ошибки - не пустые значения, это формат даты. Поскольку формат DD-MMM-YY не может быть преобразован в тип данных DT_DBDATE.

Попробуйте преобразовать название месяца в номер месяца и изменить формат даты. Например, следующее выражение преобразует формат DD-MMM-YY в формат YYYY-MM-DD:

([COL_DATE] == "" || ISNULL([COL_DATE])) ? NULL(DT_DATE) :
(DT_DATE)("20" + RIGHT([COL_DATE],2) + "-" + 
(SUBSTRING( [COL_DATE],4,3) == "JAN" ? "01" :
SUBSTRING( [COL_DATE],4,3) == "FEB" ? "02" : 
SUBSTRING( [COL_DATE],4,3) == "MAR" ? "03" :
SUBSTRING( [COL_DATE],4,3) == "APR" ? "04" :
SUBSTRING( [COL_DATE],4,3) == "MAY" ? "05" : 
SUBSTRING( [COL_DATE],4,3) == "JUN" ? "06" :
SUBSTRING( [COL_DATE],4,3) == "JUL" ? "07" :
SUBSTRING( [COL_DATE],4,3) == "AUG" ? "08" :
SUBSTRING( [COL_DATE],4,3) == "SEP" ? "09" : 
SUBSTRING( [COL_DATE],4,3) == "OCT" ? "10" : 
SUBSTRING( [COL_DATE],4,3) == "NOV" ? "11" : 
SUBSTRING( [COL_DATE],4,3) == "DEC"? "12": "00") 
+ "-" + LEFT([COL_DATE],2)  )

Ссылки

...