我有树表,Customer,Invoice和InvoiceRow以及标准关系。

这些我必须在一个固定的字段长度文件中导出,每行的前两个字符标识行类型。行类型有不同的规格。

我可以在脚本块中使用嵌套循环来完成它,但这是我的第一个SSIS包,并且该解决方案感觉不对。

编辑:

输出必须具有:

Customer  
Invoice  
Rows  
Customer  
Invoice  
Rows  
and so on
有帮助吗?

解决方案

使用“脚本目标”组件执行此操作的直觉是正确的。不幸的是,这种情况并不适合SSIS。我不认为这是一个初学者包。如果你必须使用SSIS,那么我将从内部连接所有数据开始,因此每个InvoiceRow都有一行,包含所有三个表所需的数据。

CustomerCols,InvoiceCols,RowCols

然后,在脚本目标组件中,您需要跟踪客户和发票值,因为它们会发生变化,您需要在输出中写入额外的行。

有关详细信息,请参阅使用脚本组件创建目标在脚本目的地。

我的经验表明,脚本目标可以有很好的性能。

其他提示

我会避免编写Script Destination,并且只使用Script Transform + Flat File Destination。这样,您可以专注于逻辑输出(数据字符串),同时允许SSIS对文件进行实际写入(它可能更高效,而且您专注于业务,而不是写入文件)。

首先,您需要获取非规范化数据。您可以在DBMS中进行连接和排序,但是如果您不想对DBMS施加太多压力 - 只需从中获取排序数据并使用两个SSIS Merge Join变换进行合并。

然后执行脚本:继续运行当前Customer和Invoice的值,在更改时输出它们,在每个输入上输出InvoiceRow。像这样:

if (this.CustomerID != InputBuffer.CustomerID) {
  this.CustomerID = InputBuffer.CustomerID;
  OutputBuffer.AddRow();
  OutputBuffer.OutputColumn = "Customer: " + InputBuffer.CustomerID + " " + InputBuffer.CustomerName;
}
// repeat the same code for Invoice

OutputBuffer.AddRow();
OutputBuffer.OutputColumn = "InvoiceRow: " + InputBuffer.InvoiceRowPrice;

最后,添加一个包含单个列的平面文件目标(由脚本创建的OutputColumn)将其写入文件。

处理三个表,以便输出都适合您的输出文件(包括行类型指示符)。您必须在数据流中的三个单独的流路径中执行此操作,然后在Union All数据流元素中将这些行组合在一起。从那里,根据需要处理它们以创建输出文件。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top