我在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
感谢任何帮助。我试着多次改变我的表情,但仍然失败。
答案 0 :(得分:4)
我怀疑有些日期时间值格式不正确。因此SSIS在解析时会抛出错误。
要从源表中查找不正确的日期时间值,请尝试从Derived Transformation
重定向错误行,并使用数据查看器检查不正确的数据
子字符串值的问题是如果字符串数据的格式不正确,那么Derived Transformation
将抛出错误。
前:
Select col1,
case when isDate(EVENT_D) = 1 THEN EVENT_D ELSE NULL
END as [EVENT_D],
Col2,EVENT_T,other columns
from yourTable
派生转换中的使用您的代码转换为DT_DBTIMESTAMP
类型。
否则尝试使用脚本组件并解析EVENT_D
和EVENT_T
值并转换为datetime值。无需将Derived列与所有substring
值
创建New Output column
Valid_D
,数据类型为DT_DBTIMESTAMP
。在available input Columns
Script Transformation Editor
中选择2个输入列EVENT_D和EVENT_T VB.NET代码
Dim result As DateTime
If DateTime.TryParseExact(Row.EVENT_D, "dd/MM/yyyy",
Nothing, Globalization.DateTimeStyles.None, result) Then
Row.ValidD = result.Add (TimeSpan .Parse (Row.EventT ) );
End If
C#代码
DateTime result;
if (DateTime.TryParseExact(Row.EventD, "dd/MM/yyyy",
CultureInfo.InvariantCulture, DateTimeStyles.None,out result))
{
Row.ValidD = result.Add (TimeSpan .Parse (Row.EventT ) );
}
现在,您可以在后续转换中使用Date_D类型的Valid_D列
Update
:您的语法问题是您无法以字符串格式添加日期+时间。您需要单独parse
EVENT_D和EVENT_T。
(DT_DBTIMESTAMP)(SUBSTRING(EVENT_D,7,4) + "-" +
SUBSTRING(EVENT_D,4,2) + "-" +
SUBSTRING(EVENT_D,1,2) + EVENT_T)
So your syntax is not valid.
isDate
函数显示30/04/2012
为NULL,因为根据MSDN
The return value of ISDATE depends on the settings set by
SET DATEFORMAT, SET LANGUAGE and Configure the default language
Server Configuration Option.
但它为值01/05/2012
和02/05/2012
返回1,因为它取为MM / dd / YYYY
所以第一个日期是2012年1月5日,而不是2012年5月1日
所以灵魂就是使用脚本组件并将这些值解析为有效的日期和时间,然后在随后的转换中使用它。
请检查上面的脚本转换代码
Update 2:
我认为您使用的是SSIS 2005.该代码应为
Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)
Dim result As DateTime
If DateTime.TryParseExact(Row.EVENTD, "dd/MM/yyyy", Nothing, Globalization.DateTimeStyles.None, result) Then
Row.ValidD = result.Add(TimeSpan.Parse(Row.EVENTT))
End If
End Sub
在脚本转换后,您不需要使用派生组件。在Validal列中获得的结果包含datetime
格式的有效值
答案 1 :(得分:0)
如果您想在没有脚本的情况下执行此操作,则可以从
更改表达式 (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
答案 2 :(得分:0)
我在将包含日期的字符串转换为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))