SSIS平面文件[DT_DBTIMESTAMP]无法转换为SQL datetime2

时间:2017-04-18 09:06:49

标签: sql-server ssis etl bids

我创建了一个正在运行的SSIS,我尝试将没有错误的数据插入SQL Server 但突然出现此错误消息

  

错误:数据流任务中的0xC02020A1,平面文件源[59]:数据转换失败。列" SCB_ActualDTime"的数据转换返回状态值2和状态文本"由于可能丢失数据,无法转换该值。"。

它表示错误发生在第8行,其中包含来自

的这些数据
SCB_ActualDTime
2017-04-16 15:28:07

这真的很奇怪,因为我尝试通过SQL脚本插入相同的数据,并且没有错误消息。

1 个答案:

答案 0 :(得分:1)

Flat File不是强制每列特定数据类型的数据源。因此它可能包含unicode字符或空格,以防止将列读取为Datetime。

在处理了很多案例后,我决定以这种方式使用平面文件。

  • Flat File Connection Manager我会将所有列都读为DT_STR列,而不指定其他数据类型
  • DataFlow Task内部我将添加一个脚本组件来检查列值是否可以转换为估计的数据类型然后转换它

假设日期列名称为inColumn

在DataflowTask中,添加脚本组件,将inColumn标记为输入列,使用dataType DT_DBTIMESTAMP

添加新的输出列outColumn

将脚本语言更改为vb.net

enter image description here

将您的日期列标记为输入

enter image description here

为每个日期列创建一个输出列

enter image description here

在脚本内部,在Input0_ProcessInputRow子使用DateTime.ParseExact功能如下:

在此示例中,日期列为MailReceivingDate

    Public Class ScriptMain
        Inherits UserComponent


        Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)

            If Not Row.MailReceivingDate_IsNull AndAlso
                  Not String.IsNullOrEmpty(Row.MailReceivingDate.Trim) Then

                Dim dtDate as Date

               If DateTime.TryParseExact(Row.MailReceivingDate.Trim, "yyyy-MM-dd HH:mm:ss", New System.Globalization.CultureInfo("en-GB"),System.Globalization.DateTimeStyles.None,dtDate) Then

                    Row.OutColumn = dtDate

               Else

                    'If column cannot be parsed

                    Row.outColumn_IsNull = True

               End If

            Else

                    Row.outColumn_IsNull = True

            End If

        End Sub

    End Class