如何通过 BIML 对 SSIS 包进行批量更新?

How to conduct mass updates to SSIS packages via BIML?

这是我遇到问题的场景:

假设我使用 BIML 生成(存根)50 多个 SSIS 包... 为了简单起见,假设他们每个人只有一个执行 SQL 任务。

Package1
-> SQL Audit (INSERT INTO auditTable(val1) values ?)
Package2
-> SQL Audit (INSERT INTO auditTable(val1) values ?)
...
Package50
-> SQL Audit (INSERT INTO auditTable(val1) values ?)

现在,我对每个包进行特定于包的更改...

Package1
-> SQL Audit (INSERT INTO auditTable(val1) values ?)
-> Add Dataflow: DFT Stage Data
Package2
-> SQL Audit (INSERT INTO auditTable(val1) values ?)
-> Add Expression: EXP SET Variable Value
...
Package50
-> SQL Audit (INSERT INTO auditTable(val1) values ?)
-> Add Script: SCT Call Webservice

此时,我已经使用 BIML 模板创建了 50 个包 (INSERT INTO auditTable(val1) values ?)...

但我收到了在 auditTable(val1, val2) 中存储第二列的新要求(INSERT INTO auditTable(val1,val2) values ?,?)

所以我使用更新的 BIML 模板重新生成了我的包 1->50...但是 - 这样做 - 我已经丢失了所有特定于包的自定义(添加数据流、添加表达式等)。

Package1
-> SQL Audit (INSERT INTO auditTable(val1,val2) values ?,?)
Package2
-> SQL Audit (INSERT INTO auditTable(val1,val2) values ?,?)
...
Package50
-> SQL Audit (INSERT INTO auditTable(val1,val2) values ?,?)

所以我的问题是...

处理这个问题最简单的方法是什么?

据我所知,我的选择如下:

** 我知道有更好的方法来设计这个......例如,一个更面向未来的存储过程而不是 INSERT INTO,但我只对回答核心问题感兴趣 - 这是如何在文件被覆盖后有选择地合并先前版本文件的特定部分。

通过 Biml 生成 SSIS 包是一项全有或全无的练习。 biml 编译器知道如何将 biml 翻译成 dtsx。没有用于生成 dtsx 然后将其与另一个进行比较并合并的工具。假设是包裹的真实形状被编码在Biml中。

你所采用的方法的挑战在于,你已经将自己从生成过程中分离出来——不要批评你所做的,当我学习时我也做过同样的事情。一种更 Biml-ic 的方法是修改原始的 Biml,使用元数据和条件来塑造单个包。

那么,你现在可以做什么?

1) 将您的最终包逆向工程到 Biml 中。这现在已内置到免费的 BimlExpress 产品中,因此它只是重复而不是成本因素。在 Biml 中拥有所有包后,您可以枚举所有包节点以查找与目标匹配的 Execute SQL Task 并修复它们。如果它真的是审计之类的东西,我会从我所有的个人包中抽象出来,并使它们成为每个包的 "includes"。这样当它第三次更改时,您只需进行一次更改并重新发布您的 SSIS 包。

另外的想法是使用 BimlStudio 并让 Transformer 重新定义执行 SQL 任务节点,但这会让您回到付费方法。使用转换器更新值的示例在此处链接。

2) 发出一个包,其中包含更正的执行 SQL 任务和所有关联的绑定,然后选择您选择的毒药来编辑包内的文本。我喜欢 TextPad/WildEdit,但只要它能找到这个文本块并将其替换为这个新块,任何东西都可以工作。