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。Execution 方法成功,但引发的错误数 (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

任何帮助表示赞赏。我多次尝试改变我的表情,但仍然失败。

4

3 回答 3

4

我怀疑有些日期时间值的格式不正确。所以 SSIS 在解析它们时会抛出错误。

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

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

  1. 在您的 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_DBTIMESTAMPtype 。

  1. 否则尝试使用脚本组件并解析EVENT_DEVENT_T值并转换为日期时间值。无需使用所有这些substring值的派生列

    创建一个New Output column Valid_D数据类型为. 在in 中DT_DBTIMESTAMP选择 2 个输入列 EVENT_D 和 EVENT_Tavailable input ColumnsScript Transformation Editor

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 ) );
    }

现在您可以在后续转换中使用 DateTime 类型的 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函数显示 NULL30/04/2012因为根据 MSDN

   The return value of ISDATE depends on the settings set by
   SET DATEFORMAT, SET LANGUAGE and Configure the default language
   Server Configuration Option. 

但它返回 1 的值01/05/201202/05/2012因为它采用 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

Script 转换后,不需要使用 Derived 组件。Valid_D 列中得到的结果包含datetime 格式的有效值

于 2012-12-10T07:12:32.247 回答
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

于 2012-12-10T14:22:56.367 回答
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))

于 2017-04-07T04:56:11.243 回答