我在SSIS中调试时遇到此错误:
错误:0xC0049064在数据流任务,派生列[70]:尝试执行类型转换时发生错误 . 错误:0xC0209029在数据流任务,派生列[70]:SSIS错误代码DTS_E_INDUCEDTRANSFORMFAILUREONERROR . “组件”派生列“(70)”失败,因为发生错误代码0xC0049064,并且“输出列”EVENT_DT“(118)”上的错误行处置指定错误失败 . 指定组件的指定对象发生错误 . 在此之前可能会发布错误消息,其中包含有关失败的更多信息 . 错误:数据流任务中的0xC0047022:SSIS错误代码DTS_E_PROCESSINPUTFAILED . 组件“派生列”(70)上的ProcessInput方法失败,错误代码为0xC0209029 . 标识的组件从ProcessInput方法返回错误 . 该错误特定于组件,但错误是致命的,将导致数据流任务停止运行 . 在此之前可能会发布错误消息,其中包含有关失败的更多信息 . 错误:数据流任务中的0xC0047021:SSIS错误代码DTS_E_THREADFAILED . 线程“WorkThread0”已退出,错误代码为0xC0209029 . 在此之前可能会发布错误消息,其中包含有关线程退出原因的更多信息 . 信息:0x40043008在数据流任务,DTS.Pipeline:后执行阶段开始 . 信息:0x40043009在数据流任务,DTS.Pipeline:清理阶段开始 . 信息:0x4004300B在数据流任务,DTS.Pipeline:“组件”DataReaderDest“(143)”写了0行 . 任务失败:数据流任务警告:包时的0x80019002:SSIS警告代码DTS_W_MAXIMUMERRORCOUNTREACHED . 执行方法成功,但引发的错误数(4)达到允许的最大值(1);导致失败 . 当错误数达到MaximumErrorCount中指定的数量时,会发生这种情况 . 更改MaximumErrorCount或修复错误 . SSIS包“Package.dtsx”完成:失败 .
我的表达是:
(DT_DBTIMESTAMP)(SUBSTRING(EVENT_D,7,4) + "-" +
SUBSTRING(EVENT_D,4,2) + "-" +
SUBSTRING(EVENT_D,1,2) + EVENT_T)
我的原始数据按以下顺序排列:
EVENT_D: DD/MM/YYYY
EVENT_T: HH:MM:SS
任何帮助表示赞赏 . 我已经尝试多次改变我的表达但仍然失败 .
3 回答
我怀疑有一些日期时间值不正确的格式 . 因此SSIS在解析它们时会抛出错误 .
为了从源表中查找不正确的日期时间值,请尝试从
Derived Transformation
重定向错误行,并使用数据查看器检查不正确的数据子字符串值的问题是如果字符串数据格式不正确,那么
Derived Transformation
将抛出错误 .例如:
在派生的转换中使用您的代码转换为
DT_DBTIMESTAMP
类型 .EVENT_D
和EVENT_T
值并转换为datetime值 . 无需将Derived列与所有substring
值一起使用创建
New Output column
Valid_D
,数据类型为DT_DBTIMESTAMP
. 在Script Transformation Editor
中选择available input Columns
中的2个输入列EVENT_D和EVENT_TVB.NET代码
C#代码
现在,您可以在后续转换中使用Date_D类型的Valid_D列
Update
:语法问题是您无法以字符串格式添加日期时间 . 您需要单独parse
EVENT_D和EVENT_T .isDate
函数为30/04/2012
显示NULL,因为根据MSDN但它为值
01/05/2012
和02/05/2012
返回1,因为它取MM / dd / YYYY所以第一个日期是2012年1月5日而不是2012年5月1日所以灵魂就是使用脚本组件并将这些值解析为有效的日期和时间,然后在随后的转换中使用它 .
请检查上面的脚本转换代码
我认为你使用SSIS 2005.代码应该是
在脚本转换之后,您不需要使用派生组件 . 在Validal列中获得的结果包含
datetime
格式的有效值如果你想在没有脚本的情况下这样做,你可能刚刚改变了你的表达方式
(DT_DBTIMESTAMP)(SUBSTRING(EVENT_D,7,4) + "-" + SUBSTRING(EVENT_D,4,2) + "-" + SUBSTRING(EVENT_D,1,2) + EVENT_T)
至
(DT_DBTIMESTAMP)(SUBSTRING(EVENT_D,7,4) + "-" + SUBSTRING(EVENT_D,4,2) + "-" + SUBSTRING(EVENT_D,1,2) + " " + EVENT_T)
没有日期和时间部分之间的空格是最有可能导致您的原始错误 . 你得到了
2012-04-3012:25:37
代替
2012-04-30 12:25:37
我遇到了同样的问题将包含日期的字符串转换为datetimestamp字段 . 这完全归功于现场的空间 . 所以我们需要检查空间然后将其转换为datetimestamp . 下面是相同的表达式 .
LEN(TRIM([Field1]))== 1? NULL(DT_DBTIMESTAMP):( DT_DBTIMESTAMP)(SUBSTRING([Field1],1,4)“ - ”SUBSTRING([Field1],5,2)“ - ”SUBSTRING([Field1],7,2)“”SUBSTRING([ Field1],10,2)“:”SUBSTRING([Field1],12,2))