sql-server - SSIS 顺序处理

标签 sql-server etl ssis

我在同一个数据流任务中有 5 个独立的数据流,每个数据流都有一个源和目标。我怎样才能让它们按顺序运行。它们似乎并行运行。我可能会在不同的数据流任务中这样做。但是我如何在单个数据流任务中做到这一点

最佳答案

在同一个任务中不要有独立的数据流。我知道导入/导出向导会做到这一点,但仅仅因为 Microsoft 的一个团队做了一些事情,并不能使它成为最佳实践。数据流通过“免费”并行化获得它的力量和性能。如果您不希望这样,为了维护您 future 代码的人,请创建 4 个额外的数据流并将其复制/粘贴到其中。这样做绝对没有坏处。

为了真正回答上述问题,您必须引入某种依赖关系。在可怕想法的万神殿中,以下是接近顶部的。

我假设您的数据流中包含多个独立的流,看起来类似于 OLE DB 目标的源(无关紧要)。修改您的源查询或在其后面添加一个派生列,并创建一个 int (DT_I4) 类型的列并将其命名为唯一的 HackedSortKey 并为其分配值 1。

删除除其中一个之外的所有对象上的现有 OLE DB 目标。将其替换为 OLE DB 命令。使用 OLE DB 命令的值(value)在于它允许行通过。顾名思义,OLE DB Destination 只是数据的接收器。它的唯一输出列是错误列。为每个编写您的 INSERT 查询。这是 Command 对象的设计痛点,但是当它们在数据库上执行单例操作时,您也会体验到它们在运行时的痛点。 “哦,我要插入一行。在我发出命令时稍等。哦,我要插入一行。请稍等。”每一行都会得到这种处理。

将您的第一个 Source 转换为 Command 对象。附上 Fully Blocking component给它。使用排序。按 HackedSortKey 列排序,删除重复项,不允许其他列通过。这样做的目的是强制等待。只有所有数据通过上面的 OLE DB 命令后,Sort 才会释放下游行(因为在看到所有行之前它不会知道排序是什么)。通过选择 distinct value 事物,这会将原始行减少为 A 行。

流 A 中的阻塞,遇到流 B。流 B 现在看起来像 "Source B"-> "Sort B"-> "Merge Join AB"-> "OLE DB Command B"-> "Sort on HackedSourceKey"。需要“排序 B”,因为合并连接需要排序输入。 有一个匹配,因为我们的假匹配列中使用了相同的值。但是,您需要确保它是 LEFT OUTER JOIN 匹配而不是 INNER。

起泡、冲洗、对剩余的数据流重复此过程。但实际上,您想要使用不同的数据流并让优先约束管理执行。

关于sql-server - SSIS 顺序处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17903692/

相关文章:

sql - 如何解析存储在 MS SQL 2005 中的 varbinary 中的 excel (.xls) 文件?

sql-server - 我无法在 SSIS 连接管理器下拉列表中看到 ODBC 64 位驱动程序?

visual-studio - 如何将 TFS 源代码控制与 Business Intelligence Studio 集成?

sql-server - sql server 2012 中的 SSIS 日志记录

sql - 独特的前 5 名随机查询

sql - 在 SQL 表上插入数据...找不到数据

sql - tSQL 在 SQL Azure 上设置具有“查看定义”权限的用户

sql-server - SQL登录已经存在的错误

python - Celery:异步检索上一个任务的部分结果

SSIS 改变变量范围