2

我有一个工作正常的自定义同步组件,我使用它。
最近,我从排序组件(或IsSorted=true 源组件)向它发送了一些排序数据,但是由于没有IsSorted=true属性 ,我无法将输出用作合并连接的输入。

所以我必须再次对数据进行排序,这会大大降低包的性能。

此外,在设计期间,对于我的输出,我不能有任何与输入相同的元数据。

我猜当我的组件是同步的,所以它可能被排序为它的输入,如果不是,如何使组件输出数据排序!
我真的很想知道是否有任何聪明的解决方案来解决有关自定义管道组件的详细问题。

4

2 回答 2

2

由于您的组件是同步的,因此在您的代码中的某处,您正在同步输出 ,IDTSOutput1xx与输入 , IDTSInput1xx,代码如下:

output.SynchronousInputID = input.ID;

在同步组件中PipelineBuffer(暴露于输出的组件,暴露于 中ProcessInput)基于输入缓冲区(通常带有修改或添加的列),尊重原始行排序

因此,如果您检查输入是否有序,则可以确保输出也是有序的。您可以使用一个属性从输入中读取此信息并将其设置在输出中:

output.IsOrdered = input.IsOrdered

考虑到true即使输出未排序,您也可以将此属性设置为,但在这种情况下,您依赖于输入提供的信息,这应该是正确的。

您应该只true在异步组件中显式更改此属性,在返回之前对行进行真正排序。但是,正如我所说,您可以撒谎,并将此属性设置为 true 而不返回有序行。换句话说,它是信息元数据。

如果这对您不起作用,您还必须SortKeyPositionoutput.OutputColumnCollection. 此信息还用于Merge Join确保输入除了被排序之外,还按所需列排序。

如果您想了解如何使用 SSIS 任务编辑器执行此操作,而不是在您的自定义组件中“自动”执行此操作,请阅读SSIS或SSIS #98中的 IsSorted 属性- IsSorted 是真的,但按什么排序?

于 2018-05-08T11:12:13.917 回答
0

SSIS 中的 Merge Join Transform 有一些要求。要连接两个数据源,必须对数据源进行排序,并且必须有一个可以连接它们的键。在某些情况下,我从 Query 中执行 OLEDB SOURCE 中的联接。

于 2017-07-10T18:53:37.283 回答