我有一个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)
您可以使用脚本组件转换来解析列并根据您的条件添加行。标头错误可以存储在Input0_ProcessInputRow方法之外声明的变量中。以下是我使用的步骤:
代码:
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);
}
}
}
以下是组件的外观:
以下是结果: