我正在将现有的SSIS包生成框架迁移到BIML,并且面临着迁移以下逻辑的任务。
该框架(用C#编写)基于元数据创建OLE DB源。然后,在实例化数据源之后,它将通过输出列进行查找。如果存在某些列-框架将注入特定的转换,例如Lookup等。
该逻辑的示例-OLE DB源使用查询select quantity, salesdate, prcode as productid from salesfact
。然后代码查找productid列,并检查它是否具有int数据类型。在这种情况下-添加由查找列ProductID定义的查找,具有固定的查找查询/缓存,并提供新的列DimProductID。
该方法非常动态,因为OLE DB Source可以具有来自变量或带有参数的SQL Select语句。它可以正常运行,对OLE DB Source进行Instantiate()
调用可在转换元数据中提供必要的列。
问题-可以在BIML中实现这种动态方法吗?如果是,那么任何见解或例子都将是很棒的。目前,BIML似乎是完全声明性的(即,必须在BIML脚本运行之前的某个位置定义所有元数据)。
最佳答案
经过研究,我得出的结论是BIML的工作方式不同于我们的通用方法。
生成SSIS包的BIML动作可以分为两个阶段:
BIML生成阶段-当所有C#代码位都修改模板BIML时。它名为BIML扩展,使用带有C#/ VB nuget的BIML并生成纯BIML文本。注意-如果您具有静态BIML(几乎没有意义),则可以不存在此阶段。
基于BIML的SSIS包生成。 BIML文本在这里是固定的,没有动态变化,它都在第一阶段工作。
请注意,BIML扩展是脱机完成的,即您可能没有与SSIS包中使用的DB的连接。基于BIML生成SSIS包需要DB连接,或者您必须使用BIML脱机模式。
相反,使用MS SSIS API生成SSIS完全在线。添加每个任务或转换都会实例化此类对象,并与数据库联系。对于OLE DB源-建立与数据库的连接,并检索具有其格式的列名称列表。通过“在线”工作,您可以即时检索列列表(即元数据),并且在元数据上非常简单灵活。
BIML规定,当您可以控制BIML代码/程序包的内容时,应该在BIML生成阶段以某种方式了解所有元数据。
关于最初的问题-我们决定限制灵活性。元数据描述用于通过可选参数获取数据的SQL查询。添加了一个C#模块,该模块连接到DB并获取具有其格式的列的列表,一个模块接收逻辑和条件BIML所需的元数据。