SSIS进程在平面文件中的标题和尾部之间进行记录

时间:2014-10-28 22:07:04

标签: ssis batch-processing flat-file ssis-2012

我有一个SSIS包,它使用条件拆分来获取行分隔的平面文件中的任何批头或尾部,取第一行,并从中获取错误代码。如果错误代码是> 0,我将批处理标题和预告片之间的所有正常记录写入包含该错误代码的报告中。否则,我只写出包含错误代码的普通记录。这是这个例子的样子:

//No batch level error
00000BH
00123NRNormalRecordData
00000NRNormalRecordDataNoError
00000BT

看起来像是:

╔═══════════╦══════════════════╗
║   Error   ║   Record Data    ║
╠═══════════╬══════════════════╣
║       123 ║ NormalRecordData ║
╚═══════════╩══════════════════╝

//Batch level error
05555BH
00000NRNormalRecordData
00000NRNormalRecordData
00000BT

看起来像是:

╔═══════╦═════════════════════════╗
║ Error ║       Record Data       ║
╠═══════╬═════════════════════════╣
║  5555 ║ NormalRecordData        ║
║       ║                         ║
║  5555 ║ NormalRecordData        ║
╚═══════╩═════════════════════════╝

我的问题有多个批次,现在搞砸了(只使用一批)。现在我想做类似以下的事情

//Multi batch
00000BH
00123NRNormalRecordError
00000NRNormalRecord
00000BT
00000BH
00000SRSecondaryRecordType //want to ignore batches with no NR normal records
00000BT
05555BH
00000NRNormalRecord
00000NRNormalRecord
00000BT

由于将批处理级别错误保存到变量中并在我写出记录时检查它是否为空,因此该报告将显示为:

╔═══════╦═════════════════════╗
║ Error ║    Record Data      ║
╠═══════╬═════════════════════╣
║  5555 ║ NormalRecordError   ║
║  5555 ║ SecondaryRecordType ║
║  5555 ║ NormalRecord        ║
║  5555 ║ NormalRecord        ║
║  5555 ║ NormalRecord        ║
╚═══════╩═════════════════════╝

当我希望它看起来像:

╔═══════╦═══════════════════╗
║ Error ║    Record Data    ║
╠═══════╬═══════════════════╣
║  123  ║ NormalRecordError ║
║  5555 ║ NormalRecord      ║
║  5555 ║ NormalRecord      ║
╚═══════╩═══════════════════╝

这是因为逻辑看起来像:

  • 存储批处理级别错误获取所有正常记录并显示错误,除非
  • 批次级别错误> 0然后让他们全部用批次
  • 写所有行
  • 级别错误,如果有一个或只写正常行错误 (这种情况可以按预期工作,因为批次级别变量 没有填充)

我的第一个想法是一个有条件的分裂。但是,这只会让我在行级别做一个条件,因为我需要先前行的上下文。

你会如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

您可以使用脚本组件转换来解析列并根据您的条件添加行。标头错误可以存储在Input0_ProcessInputRow方法之外声明的变量中。以下是我使用的步骤:

  1. 我使用上面的数据制作了一个包含列名数据
  2. 的列flatfile
  3. 添加脚本组件作为转换
  4. 将数据检查为输入列
  5. 添加名为RecordOutput
  6. 的新输出
  7. 将列添加到输出:错误为int,RecordData为字符串
  8. 代码:

    using System;
    using System.Data;
    using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
    using Microsoft.SqlServer.Dts.Runtime.Wrapper;
    
    [Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
    public class ScriptMain : UserComponent
    {
    
        int error;
    
        public override void Input0_ProcessInputRow(Input0Buffer Row)
        {
            //gets the row type
    
            string rowType = Row.Data.Substring(5, 2);
    
            //only sets the error variable if it is a header record
            if (rowType == "BH")
            {
                error = Convert.ToInt32(Row.Data.Substring(0, 5));
            }
    
            //Only adds a record for NR rows
            if (rowType == "NR" && (error > 0 || Convert.ToInt32(Row.Data.Substring(0, 5)) > 0))
            {
                RecordOutputBuffer.AddRow();
                if (error > 0)
                {
                    RecordOutputBuffer.Error = error;
                }
                else
                {
                    RecordOutputBuffer.Error = Convert.ToInt32(Row.Data.Substring(0, 5));
                }
                RecordOutputBuffer.RecordData = Row.Data.Substring(7, Row.Data.Length - 7);
            }
        }
    
    }
    

    以下是组件的外观: enter image description here

    以下是结果: enter image description here