为啥派生列组件的表达式不适用于 SSIS 中的空值?

Posted

技术标签:

【中文标题】为啥派生列组件的表达式不适用于 SSIS 中的空值?【英文标题】:Why expression of Derived Column component don't working with empty value in SSIS?为什么派生列组件的表达式不适用于 SSIS 中的空值? 【发布时间】:2020-02-11 04:38:03 【问题描述】:

有人可以给我建议吗?

我在 SQL Server 中有表

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)

Derived Column 组件的表达式值为:

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

我收到错误:

[派生列 [17]] 错误:SSIS 错误代码 DTS_E_INDUCEDTRANSFORMFAILUREONERROR。 “派生列”失败,因为发生错误代码 0xC0049063,并且“派生列.输出 [派生列输出].列 [COL_DATE]”上的错误行处置指定错误失败。指定组件的指定对象发生错误。在此之前可能会发布错误消息,其中包含有关失败的更多信息。

【问题讨论】:

【参考方案1】:

错误原因不是空值,而是日期格式。由于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)  )

参考文献

Convert month name to month number in SSIS

【讨论】:

以上是关于为啥派生列组件的表达式不适用于 SSIS 中的空值?的主要内容,如果未能解决你的问题,请参考以下文章

为啥`return a or b`是Ruby中的空值表达式错误?

SQL SSIS 使用派生列转换来处理空数据.. 替代方案?

如何在 SSIS 派生列中的嵌套 if 条件表达式中使用 TRIM

如果条件不满足,派生列表达式SSIS如何忽略表达式?

在 SSIS 派生列中替换 NULL

无法解析我的 SSIS 派生列表达式