这是我遇到麻烦的情况:
假设我使用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 ?)
...
但是我有一个新要求,将第二列存储在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
,但我只想回答核心问题-就是如何在文件被覆盖后有选择地合并文件的特定部分。
答案 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,但只要找到该文本块并将其替换为新块,任何东西都将起作用。