我有一个自定义同步组件,工作正常,我使用它
最近,我从排序组件发送了一些排序数据(或 IsSorted = true Source 组件)
但由于没有 IsSorted = true 属性,我无法将输出用作合并连接的输入。
所以我必须再次对数据进行排序,这会降低包的性能。
此外,在设计时我的输出中没有任何与输入相同的元数据。
我猜我的组件是同步的,所以它可能被排序为输入
如果没有,如何使组件输出数据排序!
我真的想知道是否有任何聪明的解决方案来解决有关自定义管道组件的详细问题。
答案 0 :(得分:2)
由于您的组件是同步的,因此您在代码中的某个位置将输出IDTSOutput1xx
与输入IDTSInput1xx
同步,并使用以下代码:
output.SynchronousInputID = input.ID;
在同步组件中PipelineBuffer
(暴露于输出的那个,在ProcessInput
中公开)基于输入缓冲区(通常带有修改或添加的列)尊重原始行排序强>
因此,如果您检查输入是否已订购,则可以确保输出也已订购。并且有一个属性可用于从输入中读取此信息并将其设置在输出中:
output.IsOrdered = input.IsOrdered
考虑到您可以将此属性设置为true
,即使输出未被排序,但在这种情况下,您依赖于输入提供的信息,这应该是正确的。
您应该只在异步组件中将此属性显式更改为true
,在返回它们之前您真正对行进行排序。但是,正如我所说,你可以撒谎,并将此属性设置为true而不返回有序行。换句话说,它是信息丰富的元数据。
如果这对您不起作用,您还必须在SortKeyPosition
中设置所需列的output.OutputColumnCollection
。 Merge Join
也使用此信息来确保除了订购之外的输入按所需列排序。
如果您想了解如何使用SSIS任务编辑器执行此操作,而不是在自定义组件中“自动”执行此操作,请阅读IsSorted properties in SSIS或SSIS #98 – IsSorted is true, but sorted on what?
答案 1 :(得分:0)
SSIS中的合并连接变换有一些要求。要连接两个数据源,必须对数据源进行排序,并且必须有一个可以与之连接的密钥。在某些情况下,我在Query中执行OLEDB SOURCE中的连接。