SSIS派生列DT_WSTR转DT_DBDATE报错0xC00470C2如何解决
问题根因
- SSIS的
SUBSTRING函数语法为SUBSTRING(字符表达式, 起始位置, 截取长度),你原表达式里第三个参数写了18,远超过你需要提取的21Sep2021的9位长度,会截取到后续的空字符或其他冗余内容,导致字符串不符合日期格式要求,转换失败。 DT_DBDATE类型对输入字符串的格式校验非常严格,只要存在多余字符就会触发0xC00470C2报错。
修复方案
方案1:最简修复(适用于系统区域语言为英文的环境)
修正截取长度后先转DT_DATE再转DT_DBDATE,适配月份缩写的识别:(DT_DBDATE)(DT_DATE)SUBSTRING(@[$Project::ARFileName],10,9)
你可以先单独派生一个临时列输出SUBSTRING(@[$Project::ARFileName],10,9)的结果,预览确认返回的是纯21Sep2021格式的字符串后再做转换。
方案2:全兼容修复(不受系统区域设置影响)
手动将月份缩写转换为数字,拼接为标准ISO日期格式后再转换,适配所有区域环境:
(DT_DBDATE)( /* 提取年份 */ SUBSTRING(@[$Project::ARFileName],12,4) + "-" + /* 月份缩写转数字 */ (SUBSTRING(@[$Project::ARFileName],14,3) == "Jan" ? "01" : SUBSTRING(@[$Project::ARFileName],14,3) == "Feb" ? "02" : SUBSTRING(@[$Project::ARFileName],14,3) == "Mar" ? "03" : SUBSTRING(@[$Project::ARFileName],14,3) == "Apr" ? "04" : SUBSTRING(@[$Project::ARFileName],14,3) == "May" ? "05" : SUBSTRING(@[$Project::ARFileName],14,3) == "Jun" ? "06" : SUBSTRING(@[$Project::ARFileName],14,3) == "Jul" ? "07" : SUBSTRING(@[$Project::ARFileName],14,3) == "Aug" ? "08" : SUBSTRING(@[$Project::ARFileName],14,3) == "Sep" ? "09" : SUBSTRING(@[$Project::ARFileName],14,3) == "Oct" ? "10" : SUBSTRING(@[$Project::ARFileName],14,3) == "Nov" ? "11" : "12") + "-" + /* 提取日期 */ SUBSTRING(@[$Project::ARFileName],10,2) )
调试技巧
在派生列编辑器中点击计算表达式按钮,可以直接预览当前表达式的返回结果,确认能正常生成日期值后再运行包,减少调试成本。
内容的提问来源于stack exchange,提问作者karaode
相关产品推荐
相关产品推荐

