SSIS 平面文件数字无法转换为 SQL bigint

SSIS FlatFile Numeric cant convert to SQL bigint

我正在做一个 IS 任务。我有一个名为 SCB_ActualMIN 的平面文件列,数据类型为 string [DT_STR]。我还有一个脚本组件,用于将 SCB_ActualMIN 列转换为数字数据类型。我的脚本组件中有这段代码

If Not Row.SCBActualDTime_IsNull AndAlso
              Not String.IsNullOrEmpty(Row.SCBActualDTime.Trim) Then

        Dim dtDate As Date

        If DateTime.TryParse(Row.SCBActualDTime.Trim, dtDate) Then

            Row.OutPutColumn = dtDate

        Else

            'If column cannot be parsed

            Row.OutPutColumn_IsNull = True

        End If

    Else

        Row.OutPutColumn_IsNull = True

    End If

    '''''SCBActualDTime

    If Not Row.SCBActualMIN_IsNull AndAlso
              Not String.IsNullOrEmpty(Row.SCBActualMIN.Trim) Then

        Dim MIN As Integer

        If Int32.TryParse(Row.SCBActualMIN.Trim, MIN) Then

            Row.OutPut2Column = MIN

        Else

            'If column cannot be parsed

            Row.OutPut2Column_IsNull = True

        End If

    Else

        Row.OutPut2Column_IsNull = True

    End If

如你所见,stringdatetime 数据类型的转换是成功的。 stringinteger 使用相同的代码。 Int32.TryParse(Row.SCBActualMIN.Trim, MIN) 总是 return false 即使我在行代码中有值 09764377211。我还有其他方法可以避免重复代码吗?

9764377211 大于 2147483647,这是可以分配给 Int32

的最大值

尝试将值转换为 Int64Double 而不是 Int32

    Dim MIN As Int64

    If Int64.TryParse(Row.SCBActualMIN.Trim, MIN) Then

        Row.OutPut2Column = MIN

    Else

        'If column cannot be parsed

        Row.OutPut2Column_IsNull = True

    End If

    Dim MIN As Double

    If Double.TryParse(Row.SCBActualMIN.Trim, MIN) Then

        Row.OutPut2Column = MIN

    Else

        'If column cannot be parsed

        Row.OutPut2Column_IsNull = True

    End If

您无法避免重复,因为您必须检查每一列是否为空,方法是使用它自己 _IsNull 属性。您可以尝试通过创建函数来最小化代码。

首先,就像@Yahfoufi 建议抛出异常是因为值 "9764377211 大于 2147483647,这是可以分配给 Int32 的最大值..."=62= ]

您可以在此 MSDN article 中阅读有关数据类型和相应最大值的更多信息。

Type    Storage size    Range
Int32    4 bytes    -2,147,483,648 to 2,147,483,647
Int64    8 bytes    Approximately -9.2E+18 to 9.2E+18
Double   8 bytes    Approximate range is -1.79E+308 to 1.79E+308 with accuracy of about 15 digits. Can represent numbers as small as 1E-323.
Decimal  12 bytes   Approximate range is -7.9E+28 to 7.9E+28 with accuracy of 28 digits. Can represent numbers as small as 1E-28.
...

您可以将此值分配给 Int64DecimalDouble 数据类型

优化您的代码

在这种情况下,您无法避免重复这些部分代码,因为使用了无法动态调用的独立属性:

  1. 检查输入列是否为 Null 或空

     If Not Row.SCBActualMIN_IsNull AndAlso
          Not String.IsNullOrEmpty(Row.SCBActualMIN.Trim) Then
    
  2. 如果值无法解析或输入为 Null 或 Empty

    ,则将 Null 分配给输出列
    Row.OutPut2Column_IsNull = True
    

您可以修改代码以尽量减少行数,但我认为这不会提高性能

  • 对于每种数据类型,在 RowProcessing Sub 中声明一个变量,并编写如下代码:

假设这两列包含日期

Dim dtDate As Date

If Not Row.SCBActualDTime_IsNull AndAlso
          Not String.IsNullOrEmpty(Row.SCBActualDTime.Trim) AndAlso 
          DateTime.TryParse(Row.SCBActualDTime.Trim, dtDate)Then

        Row.OutPutColumn = dtDate

    Else

        'If column cannot be parsed or it is null

        Row.OutPutColumn_IsNull = True

    End If

'Assuming that SCBActualMIN is a Date

If Not Row.SCBActualMIN_IsNull AndAlso
          Not String.IsNullOrEmpty(Row.SCBActualMIN.Trim) AndAlso 
          DateTime.TryParse(Row.SCBActualMIN.Trim, dtDate)Then

        Row.OutPut2Column = dtDate

    Else

        'If column cannot be parsed

        Row.OutPut2Column_IsNull = True

    End If

如果性能良好或最佳,拥有大量代码行不是问题,而且尽量减少代码行数也不一定会提高性能

SSIS 上的有用链接,SQL,.Net 数据类型