我在同一个数据流任务中有 5 个独立的数据流,每个数据流都有一个源和目标。我怎样才能让它们按顺序运行。它们似乎并行运行。我可能会在不同的数据流任务中这样做。但我怎么能在单个数据流任务中做到这一点
2 回答
在同一个任务中不要有独立的数据流。我知道导入/导出向导会做到这一点,但仅仅因为 Microsoft 的一个团队做了一些事情,并不能使它成为最佳实践。数据流通过“免费”并行化获得它的力量和性能。如果您不希望这样,为了维护您未来代码的人,请创建 4 个额外的数据流并将其复制/粘贴到其中。这样做绝对没有坏处。
为了实际回答上述问题,您将不得不引入某种依赖关系。在可怕想法的万神殿中,以下是接近顶部的。
我假设您的数据流中包含多个独立的流,看起来类似于 OLE DB 目标的源(无关紧要)。修改您的源查询或在其后添加一个派生列,并创建一个 int 类型的列 (DT_I4),并将其命名为唯一HackedSortKey
值并为其分配值 1。
删除除其中一个之外的所有其他对象上的现有 OLE DB 目标。将其替换为 OLE DB 命令。使用 OLE DB 命令的价值在于它允许行通过。顾名思义,OLE DB Destination 只是数据的接收器。它的唯一输出列是错误列。为每个写下您的INSERT
查询。这是 Command 对象的设计痛点,但是当它们在数据库上执行单例操作时,您也会体验到它们在运行时的痛点。“哦,我要插入一行。在我发出命令时稍等。哦,我要插入一行。请稍等。” 每一行都会得到这种待遇。
将您的第一个 Source 用于 Command 对象。将一个完全阻塞组件附加到它。使用排序。按 HackedSortKey 列排序,删除重复项,不允许其他列通过。这样做的目的是强制等待。只有当所有数据都通过上面的 OLE DB 命令后,Sort 才会释放下游行(因为在看到所有行之前它不会知道排序是什么)。通过选择不同的值事物,这会将原始行减少为 A 行。
流 A 中的阻塞,遇到流 B。流 B 现在看起来像“源 B”->“排序 B”->“合并加入 AB”->“OLE DB 命令 B”->“在 HackedSourceKey 上排序”。需要“排序 B”,因为合并连接需要排序输入。将有一个匹配,因为我们的假匹配列中使用了相同的值。但是,您需要确保它是 LEFT OUTER JOIN 匹配而不是 INNER。
对剩余的数据流进行泡沫、冲洗、重复此过程。但实际上,您希望使用不同的数据流并让优先约束管理执行。
使用 Completion 约束而不是 Success 约束按顺序排列数据流。这样,他们每个人都将独立于其他人的成功或失败运行,但一次运行一个。
要设置约束的值,请双击从一个任务到另一个任务的行,然后将值从 Success 更改为 Completion。