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

时间:2019-01-25 16:01:22

标签: git ssis 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

至此,我已经使用(INSERT INTO auditTable(val1) values ?) ...

使用BIML模板创建了50个软件包。

但是我有一个新要求,将第二列存储在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 ?,?)

所以我的问题是...

最简单的方法是什么?

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

  • 找到一种使用版本控制(git或tfs)将文件的旧版本的特定部分选择性地合并到更新的模板中的方法?能做到吗?怎么样?
  • 维护每个包装的临时副本并复制/粘贴,重新连接被擦除的组件
  • 是否有一种方法可以配置BIML,使其仅覆盖包的某些部分(而不是整个包)?

**我知道有更好的方法来设计此方法...例如,一种更具前瞻性的存储过程,而不是INSERT INTO,但我只想回答核心问题-就是如何在文件被覆盖后有选择地合并文件的特定部分。

1 个答案:

答案 0 :(得分:2)

通过Biml生成SSIS包是一项全有或全无的练习。 biml编译器知道如何将biml转换为dtsx。没有生成dtsx并将其与另一个进行比较并合并的功能。假设包装的真实形状是在Biml中编码的。

您采用的方法所面临的挑战是,您已将自己从生成过程中分离出来-在我学习相同的东西时,不要敲打您所做的一切。一种更为Biml-ic的方法是使用元数据和有条件的条件来修改原始Biml,从而修改单个包装。

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

1)将最终包装反向工程为Biml。现在,它已内置在免费的BimlExpress产品中,因此它只是重复的,而不是成本因素。将所有软件包都保存在Biml中后,就可以枚举所有软件包节点,以查找与目标匹配的Execute SQL Task并对其进行修复。如果确实是审计之类的东西,我会从我所有的单独软件包中提取出来,并使其成为每个软件包的“包含”。这样,当第三次更改时,您只需进行一次更改,然后重新发送SSIS程序包即可。

还有其他想法是使用BimlStudio并让Transformer重新定义Execute SQL Task节点,但这会让您重回付费方式。在那里链接了使用变压器更新值的示例。

2)发出具有更正的Execute SQL Task和所有相关联的绑定的程序包,然后选择您的选择毒物来编辑程序包中的文本。我喜欢TextPad / WildEdit,但只要找到该文本块并将其替换为新块,任何东西都将起作用。