保留 NULL 不适用于所有列

Retain NULL not working for all columns

我有一个包含以下信息的平面文件,我试图将其加载到 SQL 服务器 table 中,其列和数据类型与日期相同 -

StartDate,EndDate
2017-01-02,2017-03-01

2017-01-02,2017-03-01

请注意,第二行是空白的。现在我将两个源列都设置为 DT_DBDATE 数据类型。同样在平面文件源中,我正在检查选项 Retain null values from the source as null values in the data flow

在目标 DFT,我启用了 Keep NULL 选项。 这就是问题所在。当我 运行 包时,我看到 StartDate 为空,但对于 EndDate,我看到以下错误 -

Error:Year, Month, and Day parameters describe an un-representable DateTime.

知道如何解决这个问题或导致这个问题的原因吗?

问题

空行不包含任何列分隔符,这意味着它只包含一列,这会在从故障文件读取时出现问题。

如何修复

在平面文件连接管理器中删除列定界符并将每一行读取为 DT_STR 类型的一列并将长度设置为 4000

然后添加脚本组件并执行以下操作:

  1. 检查该行是否为空
    • 如果是输出空列
    • 如果不将行拆分为列
  2. 输出必须包含您需要的列

你可以使用类似的代码:(我用的是vb.net)

    Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)

        If Not Row.Column0_IsNull AndAlso
                    Not String.IsNullOrEmpty(Row.Column0) Then

            Dim strcolumnms() As String = Row.Column0.Split(CChar(";"))

            Dim dtTemp As Date


            If DateTime.TryParse(strcolumnms(0), System.Globalization.CultureInfo.InvariantCulture, Globalization.DateTimeStyles.None, dtTemp) Then

                Row.Column1 = dtTemp

            Else

                Row.Column1_IsNull = True

            End If


            If DateTime.TryParse(strcolumnms(1), System.Globalization.CultureInfo.InvariantCulture, Globalization.DateTimeStyles.None, dtTemp) Then

                Row.Column2 = dtTemp

            Else

                Row.Column2_IsNull = True

            End If


        Else

            Row.Column1_IsNull = True
            Row.Column2_IsNull = True





        End If

    End Sub

处理平面文件中的日期

当处理存储在平面文件中的日期值(或其他数据类型)并使用 [=16= 转换它们(在检查它们是否格式正确后)时,最好选择 DT_STR 类型] 或 Data Conversion 转换。

使用脚本组件

首先你必须添加一个 Script component,将日期列标记为输入,创建一个类型为 DT_DBDATE

的新输出列

如果您想检查特定的日期格式,您可以使用 DateTime.TryParseExact() method or you use DateTime.TryParse() 尝试根据 CultureInfo 日期格式解析日期。

我举两个例子: 假设输入列名是inDate,输出列是outDate

DateTime.TryParseExact()

Dim strFormats() As String = {"yyyy-MM-dd"}

Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)



    If Not Row.inDate_IsNull AndAlso
                 Not String.IsNullOrEmpty(Row.inDate) Then


        Dim dtTemp As DateTime

        If DateTime.TryParseExact(Row.inDate, strFormats, System.Globalization.CultureInfo.InvariantCulture, Globalization.DateTimeStyles.None, dtTemp) Then

            Row.outDate = dtTemp

        Else

            Row.outDate_IsNull = True

        End If



    End If
End Sub

DateTime.TryParse()

 Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)



    If Not Row.inDate_IsNull AndAlso
                 Not String.IsNullOrEmpty(Row.inDate) Then


        Dim dtTemp As DateTime

        If DateTime.TryParse(Row.inDate, System.Globalization.CultureInfo.InvariantCulture, Globalization.DateTimeStyles.None, dtTemp) Then

            Row.outDate = dtTemp

        Else

            Row.outDate_IsNull = True

        End If



    End If
End Sub

您可以在以下博文中阅读有关使用 SSIS 脚本组件进行日期时间转换的更多信息:

  • SSIS convert string date with various formats to DateTime

使用数据转换转换

使用数据转换组件将 DT_STR 列转换为 DT_DBDATE 并在 Error Output 上设置 Ignore failure,以便将无法转换的值替换为 NULL