SSIS派生列错误

时间:2012-12-10 06:01:20

标签: ssis expression

我在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 个答案:

答案 0 :(得分:4)

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

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

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

  1. 在您的OLEDB源组件中尝试编写sql并仅获取正确的日期时间值
  2. 前:

     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类型。

    1. 否则尝试使用脚本组件并解析EVENT_DEVENT_T值并转换为datetime值。无需将Derived列与所有substring

      一起使用

      创建New Output column Valid_D,数据类型为DT_DBTIMESTAMP。在available input Columns

      Script Transformation Editor中选择2个输入列EVENT_D和EVENT_T
    2. 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格式的有效值

答案 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))