【问题标题】:SSIS Flat File [DT_DBTIMESTAMP] cant convert to SQL datetime2SSIS 平面文件 [DT_DBTIMESTAMP] 无法转换为 SQL datetime2
【发布时间】:2017-04-18 09:06:48
【问题描述】:

我创建了一个正在运行的 SSIS,并尝试向 SQL Server 插入数据而没有错误 但是突然弹出这个错误信息

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

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

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

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

【问题讨论】:

  • 尝试从传入的数据中删除该行,看看是否仍然出现错误。

标签: sql-server ssis etl bids


【解决方案1】:

Flat File 不是为每列强制指定特定数据类型的数据源。因此它可能包含阻止将列读取为日期时间的 unicode 字符或空格。

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

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

假设日期列名是inColumn

在DataflowTask中,添加一个脚本组件,将inColumn标记为输入列,添加一个新的输出列outColumn,数据类型为DT_DBTIMESTAMP

将脚本语言更改为 vb.net

将您的日期列标记为输入

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

在脚本内部,在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

【讨论】:

  • 我在代码行DateTime.TryParseExact(Row.SCBActualDTime.Trim, "yyyy-MM-dd HH:mm:ss", New System.Globalization.CultureInfo("en-GB"), dtDate) 中遇到错误,错误消息显示Overload resulotion failed because no accessible 'TryParseExact' accepts this number of arguments。顺便说一句,我正在使用 Microsoft VB 2012。
  • 抱歉我错过了参数DateTimeStyles 使用下面的代码DateTime.TryParseExact(Row.SCBActualDTime.Trim, "yyyy-MM-dd HH:mm:ss", New System.Globalization.CultureInfo("en-GB"),System.Globalization.DateTimeStyles.None,dtDate)
  • @VianOjedaGarcia 我编辑了我的答案。您可以在此链接msdn.microsoft.com/en-us/library/… 中阅读有关此方法的更多信息
  • 在我接受你的回答之前的最后一件事。如果我有另一列要处理怎么办。它会为我的 column2 创建另一个子吗?
  • @VianOjedaGarcia not Overrides Sub Input0_ProcessInputRow 用于行处理,只需重复此子中的代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-18
  • 1970-01-01
  • 2018-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多