保留 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
然后添加脚本组件并执行以下操作:
- 检查该行是否为空
- 如果是输出空列
- 如果不将行拆分为列
- 输出必须包含您需要的列
你可以使用类似的代码:(我用的是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
我有一个包含以下信息的平面文件,我试图将其加载到 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
然后添加脚本组件并执行以下操作:
- 检查该行是否为空
- 如果是输出空列
- 如果不将行拆分为列
- 输出必须包含您需要的列
你可以使用类似的代码:(我用的是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