SSIS中Varchar转DT_DBTIMESTAMP时的NULL值处理问题求助
SSIS中Varchar日期转DT_DBTIMESTAMP的NULL值处理方案
问题原因
你的表达式仅通过ISNULL([start_at])判断NULL,但实际数据中可能存在空字符串('')或长度不足的无效值,此时SUBSTRING函数仍会抛出错误;另外SSIS的ISNULL函数仅严格判断NULL,对空字符串不生效,导致你的修改未达到预期。
有效解决方案
方案1:扩展判断条件,覆盖NULL和空字符串
修改表达式,同时检查NULL、空字符串及有效长度,避免无效值进入SUBSTRING逻辑:
(ISNULL([start_at]) || LEN(TRIM([start_at])) == 0 || LEN([start_at]) < 16) ? NULL(DT_DBTIMESTAMP) : (DT_DBTIMESTAMP)(SUBSTRING([start_at], 1, 4) + "-" + SUBSTRING([start_at], 6, 2) + "-" + SUBSTRING([start_at], 9, 2) + " " + SUBSTRING([start_at], 12, 5) + ":00")
- 增加
LEN(TRIM([start_at])) == 0:处理空字符串或仅含空格的无效值 - 增加
LEN([start_at]) < 16:过滤长度不足的格式错误值(目标格式2023-01-02T00:00长度为16)
方案2:使用TRY_CAST简化转换(SSIS 2012+)
SSIS 2012及以后版本支持TRY_CAST函数,它会自动处理NULL、格式错误等情况,返回NULL而非报错。结合你的格式需求(补全秒数),表达式可简化为:
TRY_CAST([start_at] + ":00" AS DT_DBTIMESTAMP)
- 若
[start_at]为NULL,拼接后仍为NULL,TRY_CAST返回NULL - 若
[start_at]格式有效,补全秒数后直接转换为DT_DBTIMESTAMP - 若
[start_at]格式无效,同样返回NULL,避免任务失败
方案3:利用派生列的错误输出(兜底处理)
如果仍有特殊格式的无效值,可在派生列转换中设置错误输出:
- 选中派生列转换,右键选择「编辑」
- 在「输入输出列」选项卡中,找到目标派生列,将「错误处理」设置为「忽略失败」或「重定向行」
- 忽略失败会自动将错误值设为NULL,重定向行则将无效数据单独输出到错误流,方便后续排查
内容的提问来源于stack exchange,提问作者Meet Bardoliya
相关产品推荐
相关产品推荐

