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
如你所见,string
到 datetime
数据类型的转换是成功的。 string
到 integer
使用相同的代码。 Int32.TryParse(Row.SCBActualMIN.Trim, MIN)
总是 return false 即使我在行代码中有值 09764377211
。我还有其他方法可以避免重复代码吗?
9764377211
大于 2147483647
,这是可以分配给 Int32
的最大值
尝试将值转换为 Int64
或 Double
而不是 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.
...
您可以将此值分配给 Int64
或 Decimal
或 Double
数据类型
优化您的代码
在这种情况下,您无法避免重复这些部分代码,因为使用了无法动态调用的独立属性:
检查输入列是否为 Null 或空
If Not Row.SCBActualMIN_IsNull AndAlso
Not String.IsNullOrEmpty(Row.SCBActualMIN.Trim) Then
如果值无法解析或输入为 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 数据类型
- https://msdn.microsoft.com/en-us/library/cc716729(v=vs.110).aspx
- http://www.sqlservergeeks.com/sql-server-and-ssis-data-types/
- https://docs.microsoft.com/en-us/sql/integration-services/extending-packages-custom-objects/data-flow/working-with-data-types-in-the-data-flow#mapping-data-types-in-the-data-flow
- https://docs.microsoft.com/en-us/sql/integration-services/data-flow/integration-services-data-types
我正在做一个 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
如你所见,string
到 datetime
数据类型的转换是成功的。 string
到 integer
使用相同的代码。 Int32.TryParse(Row.SCBActualMIN.Trim, MIN)
总是 return false 即使我在行代码中有值 09764377211
。我还有其他方法可以避免重复代码吗?
9764377211
大于 2147483647
,这是可以分配给 Int32
尝试将值转换为 Int64
或 Double
而不是 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.
...
您可以将此值分配给 Int64
或 Decimal
或 Double
数据类型
优化您的代码
在这种情况下,您无法避免重复这些部分代码,因为使用了无法动态调用的独立属性:
检查输入列是否为 Null 或空
If Not Row.SCBActualMIN_IsNull AndAlso Not String.IsNullOrEmpty(Row.SCBActualMIN.Trim) Then
如果值无法解析或输入为
,则将Null
或 EmptyNull
分配给输出列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 数据类型
- https://msdn.microsoft.com/en-us/library/cc716729(v=vs.110).aspx
- http://www.sqlservergeeks.com/sql-server-and-ssis-data-types/
- https://docs.microsoft.com/en-us/sql/integration-services/extending-packages-custom-objects/data-flow/working-with-data-types-in-the-data-flow#mapping-data-types-in-the-data-flow
- https://docs.microsoft.com/en-us/sql/integration-services/data-flow/integration-services-data-types