SSIS FlatFile数字转换为SQL bigint

时间:2017-04-19 08:49:01

标签: sql-server vb.net ssis etl sql-server-data-tools

我正在做一个IS任务。我有一个名为SCB_ActualMIN的flatfile列,其数据类型为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)09764377211也始终返回false。还有其他方法让我避免重复代码。

2 个答案:

答案 0 :(得分:2)

if (!string.IsNullOrWhiteSpace(queryString)) { queryString = queryString.Replace("\"", string.Empty); flagedIssues = flagedIssues.Where( i => CleanHtml(i.Description).Contains(queryString) || i.IssueTagses.Any(t => t.Tag.Contains(queryString)) || i.Category.Description.Contains(queryString)); } private string CleanHtml(string dirtyString) { HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(dirtyString); return doc.DocumentNode.InnerText; } 大于9764377211,这是可以分配给2147483647的最大值

尝试将值转换为Int32Int64而非Double

Int32

OR

    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 属性来检查每列是否为null。您可以尝试通过创建函数来最小化代码。

答案 1 :(得分:2)

首先,像@Yahfoufi建议引发异常,因为值“9764377211大于2147483647,这是可以分配给Int32的最大值......”

您可以在此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. 检查输入列是空还是空

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

    ,则将Null分配给输出列
    Row.OutPut2Column_IsNull = True
    
  3. 您可以修改代码以尽量减少行数,但我认为不会提高性能

    • 对于每个数据类型,在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数据类型的有用链接