SSIS事务数据(不同的记录类型,一个文件)

时间:2009-06-15 01:46:43

标签: ssis types record

有趣的是,我们正在评估用于预处理报表数据的ETL工具(例如公用事业账单,银行对账单)以进行打印。

一些数据来自单个平面文件,具有不同的记录类型。

e.g。作为第一个字段的记录类型为“01”将是地址数据。这将有名称和地址字段。带有“02”的记录类型将是汇总数据,包括余额和总计。记录类型“03”将是声明中的行项目。

每个语句都有一条01和02条记录,以及多条03条记录。我可以预先解析文件并拆分成3个文件以便加载到表中,但这不太理想。

我们接受文件并对其进行一些操作(例如,在地址记录中添加几个字段,并可能进行一些总计/验证),然后以几乎相同的格式发送文件(但是添加了额外的字段)到我们的印刷作品程序。

你会如何在SSIS中做到这一点?

4 个答案:

答案 0 :(得分:6)

SSIS中变量记录的一个大问题是,连接管理器无法获得布局的任何好处,因为连接管理器只能处理单个布局。

通常,您最终得到一个CRLF终止的平面文件,其中包含两列:recordtype和recorddata。然后将条件拆分放入并解析不同路径上的每种类型的行。解析必须拆分剩余的记录数据并将其放入列中并正常转换,使用派生列转换或脚本转换以及可能的转换转换。

如果你有很多套餐要做,我会认真考虑编写一个自定义组件,它产生3个输出已经转换为你的目的地类型。

答案 1 :(得分:3)

回答了我自己的问题 - 见下面的脚本。 AcctNum来自平面文件源的派生列,将正确填充02记录类型,将其保存在本地静态varialbe中,并将其放回到不包含acct编号的其他记录类型的行上。

/ * Microsoft SQL Server Integration Services脚本组件 *使用Microsoft Visual C#2008编写脚本。 * ScriptMain是脚本的入口点类。* /

使用System; 使用System.Data; 使用Microsoft.SqlServer.Dts.Pipeline.Wrapper; 使用Microsoft.SqlServer.Dts.Runtime.Wrapper;

[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute] 公共类ScriptMain:UserComponent {     static String AccountNumber = null;

public override void PreExecute()
{
    base.PreExecute();
    /*
      Add your code here for preprocessing or remove if not needed
    */
}

public override void PostExecute()
{
    base.PostExecute();
    /*
      Add your code here for postprocessing or remove if not needed
      You can set read/write variables here, for example:
      Variables.MyIntVar = 100
    */
}

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    if (Row.RecordType == "02")
        AccountNumber = Row.AcctNum; // Store incomming Account Number into local script variable
    else if (Row.RecordType == "06" || Row.RecordType == "07" || Row.RecordType == "08" ||
             Row.RecordType == "09" || Row.RecordType == "10")
        Row.AcctNum = AccountNumber; // Put Stored Account Number on this row.
}

}

答案 2 :(得分:0)

这是可能的,你必须编写自定义逻辑。我用DTS做了一次。 如果文件是分隔的,SSIS将正确导入字段。您可以编写一个检查记录类型字段的脚本,然后根据记录类型分支到不同的插入。如果文件具有未分隔的记录,但每种类型都有自己的固定宽度,则会变得更加复杂,因为您必须解析并拆分每个导入的行,并在脚本中对记录类型及其宽度进行硬编码

答案 3 :(得分:-1)

有几种方法可以做到,但我认为最容易理解的是在源任务之后添加条件分割,然后通过一堆数据转换任务推送它以获得正确的数据格式

确保您的源设置了正确的数据类型,因此没有任何内容(例如所有字符串)。然后只需检查该条件拆分中的“记录类型”字段,将其发送到右侧分支。