SSIS脚本组件实现错误行输出问题求助
解决SSIS Script Component无法输出无效CSV行的问题
嘿,我来帮你搞定这个麻烦!要把那些列数不符的无效CSV行输出到单独文件,核心是给Script Component加个专门的输出流,还要确保能拿到原始行内容——不然输出的无效行根本没意义。下面一步步来操作:
1. 给Script Component新增无效行输出流
打开Script Component编辑器,切换到「Inputs and Outputs」标签页:
- 右键点击「Outputs」→ 选择「Add Output」,给这个新输出起个好记的名字,比如
InvalidRowsOutput - 选中这个新输出,在右侧属性面板把
SynchronousInputID设置为None(让它成为独立的异步输出,和有效行的数据流彻底分开) - 给
InvalidRowsOutput添加一列,比如叫RawRow,数据类型选DT_STR或者DT_WSTR,长度设得足够大(比如4000,根据你的CSV实际行长度调整)
2. 修改VB.Net代码处理无效行
首先得确保你的输入流里包含原始整行内容:如果还没有,去Flat File Source那边配置——打开它的高级编辑器,在「Input and Output Properties」里新增一个「Raw Data」列,或者用派生列组件把整行内容存成一个新列(比如命名为RawRowContent)。
然后调整你的代码:
' 在类级别声明无效行输出的缓冲区变量 Private invalidOutputBuffer As InvalidRowsOutputBuffer Public Overrides Sub PreExecute() MyBase.PreExecute() ' 获取无效行输出的缓冲区实例 invalidOutputBuffer = Me.InvalidRowsOutputBuffer End Sub Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer) Dim isValid As Boolean = True ' 这里是判断行是否有效的核心逻辑:检查列数是否为24 ' 注意:如果CSV包含带逗号的引号字段,别直接用Split,用TextFieldParser解析更准确 Dim rawRow As String = Row.RawRowContent ' 假设原始行内容存在这个列里 Dim columns As String() = rawRow.Split(","c) If columns.Length <> 24 Then isValid = False End If ' 保留你原有处理有效行的逻辑 If isValid Then ' 这里放你原来处理有效行的代码,比如给输出列赋值等操作 ' ... Else ' 将无效行写入专门的输出流 invalidOutputBuffer.AddRow() invalidOutputBuffer.RawRow = rawRow End If End Sub Public Overrides Sub PostExecute() MyBase.PostExecute() ' 通知SSIS无效行输出已完成 invalidOutputBuffer.SetEndOfRowset() End Sub
3. 连接输出到目标平面文件
回到SSIS数据流设计界面,把Script Component的InvalidRowsOutput拖线到「Flat File Destination」,配置好目标文件的路径和格式,这样无效行就会自动写入指定文件了!
额外提醒
- 如果你的CSV里有带逗号的字段(比如
"张三,李四",25这种格式),直接用Split(",")会把字段拆错,这时候用Microsoft.VisualBasic.FileIO.TextFieldParser来解析才是正确的做法 - 要是Flat File Source已经自动把无效行转到错误输出了,那更省事——直接把错误输出连接到Flat File Destination就行,不用在Script Component里额外处理
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

