首页 文章

SSIS派生列错误

提问于
浏览
0

我在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 回答

  • 4

    我怀疑有一些日期时间值不正确的格式 . 因此SSIS在解析它们时会抛出错误 .

    为了从源表中查找不正确的日期时间值,请尝试从 Derived Transformation 重定向错误行,并使用数据查看器检查不正确的数据

    子字符串值的问题是如果字符串数据格式不正确,那么 Derived Transformation 将抛出错误 .

    • 在OLEDB源组件中尝试编写sql并仅获取正确的日期时间值

    例如:

    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_DEVENT_T 值并转换为datetime值 . 无需将Derived列与所有 substring 值一起使用

    创建 New Output column Valid_D ,数据类型为 DT_DBTIMESTAMP . 在 Script Transformation Editor 中选择 available input Columns 中的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/201202/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 格式的有效值

  • 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

  • 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))

相关问题