【问题标题】:How to skip last row in the SSIS data flow如何跳过 SSIS 数据流中的最后一行
【发布时间】:2017-07-27 04:20:19
【问题描述】:
我在我的数据流中使用FlatFile Source Manager --> Script COmponent as Trans --> OLEDB destination。
源从平面文件中读取所有行,我想跳过更新数据库的最后一行(预告片记录)。
由于它包含NULL 值,数据库会抛出错误。
请帮我解决这个问题。
问候,
VHK
【问题讨论】:
标签:
sql-server
ssis
etl
ssis-2012
dataflow
【解决方案1】:
要忽略最后一行,您必须执行以下步骤:
- 添加
DataFlow Task (我们将其命名为DFT RowCount)
- 添加类型为
System.Int32 的全局变量(名称:User::RowCount)
- 在此 DataFlow 任务中添加
Flat File Source (您要导入的文件)
- 在
Flat File Source 旁边添加一个RowCount 组件
- 将
RowCount 结果映射到变量User::RowCount
- 添加另一个
DataFlow Task (我们将其命名为DFT Import)
- 在
DFT Import 添加Flat File Source (您需要导入的文件)
- 在
Flat File Source 旁边添加Script Component
- 将
User::RowCount 变量添加到脚本只读变量
- 添加
DT_BOOL 类型的输出列(名称:IsLastRow)
-
在脚本窗口中编写以下脚本
Dim intRowCount As Integer = 0
Dim intCurrentRow As Integer = 0
Public Overrides Sub PreExecute()
MyBase.PreExecute()
intRowCount = Variables.RowCount
End Sub
Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)
intCurrentRow += 1
If intCurrentRow = intRowCount Then
Row.IsLastRow = True
Else
Row.IsLastRow = False
End If
End Sub
在脚本组件旁边添加Conditional Split
-
使用以下表达式拆分行
[IsLastRow] == False
- 在条件拆分旁边添加
OLEDB Destination
旁注:如果您想忽略另一种情况的行(不是最后一行),只需更改脚本组件中编写的脚本以满足您的要求
【解决方案2】:
如果您的要求是避免平面文件中包含空值的行,那么您可以按照以下方法,
- 使用源组件从平面文件中读取数据。
- 使用
Conditional Split组件,并在case expression中提供!ISNULL(Column1) && !ISNULL(Column2)(Column1和Column2可以随心所欲。如果您的平面文件有一个名为的列,比如说ID并且它没有空值除了最后一行,则可以使用!ISNULL(ID))。
- 将案例输出映射到 OLEDB 目标。
希望对你有很大帮助。