SSIS 自定义组件:具有任何 IsSorted 属性 和输出元数据

SSIS Custom Component: Having any IsSorted Property and output metadata

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

所以我不得不再次对数据进行排序,这大大降低了包的性能。

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

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

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

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

output.SynchronousInputID = input.ID;

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

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

output.IsOrdered = input.IsOrdered

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

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

如果这对您不起作用,您还必须在 output.OutputColumnCollection 中设置所需列的 SortKeyPositionMerge Join 也使用此信息来确保输入除了被排序之外,还按所需的列排序。

如果您想了解如何使用 SSIS 任务编辑器执行此操作,而不是在您的自定义组件中执行此操作 "automagically",请阅读 IsSorted properties in SSIS or SSIS #98 – IsSorted is true, but sorted on what?