如何获取 BIML 脚本中的输出列列表 - 基于列的生成

How to get list of output columns inside BIML script - column based generation

我正在将现有的 SSIS 包生成框架迁移到 BIML,并面临迁移以下逻辑的任务。
该框架(用 C# 编写)基于元数据创建 OLE DB Source。然后,在实例化数据源之后,它会查看输出列。如果存在某些列 - 框架会注入特定的转换,例如 Lookup

Example of that logic - OLE DB Source uses query select quantity, salesdate, prcode as productid from salesfact. Then code looks up for productid column and checks whether it has int data type. If this is the case - adds Lookup, which is defined by the lookup column ProductID, has fixed lookup query/cache and provides new column DimProductID.

该方法非常动态,因为 OLE DB Source 可以有来自变量或带参数的 SQL Select 语句。它 运行 正确,对 OLE DB 源 Instantiate() 调用在转换元数据中提供了必要的列。
问题 - 这种动态方法可以在 BIML 中实现吗?如果是 - 任何见解或例子都会很棒。现在 BIML 似乎完全是声明式的(即所有元数据都必须在 BIML 脚本之前的某处定义 运行)。

经过一些研究,我得出结论,BIML 的工作方式与我们的通用方法不同。
生成 SSIS 包的 BIML 操作可分为两个阶段:

  • BIML 生成阶段 - 当所有 C# 代码位修改模板 BIML 时。它被命名为 BIML Expansion,采用带有 C#/VB nugets 的 BIML 并生成纯 BIML 文本。注意 - 如果您有静态 BIML(这毫无意义),则可以不存在此阶段。
  • 基于 BIML 的 SSIS 包生成。 BIML 文本在这里是固定的,没有动态,都是在第一阶段工作的。

请注意,BIML 扩展是离线完成的,即您可能没有连接到 SSIS 包中使用的数据库。基于 BIML 生成 SSIS 包需要 DB 连接,或者你必须使用 BIML 离线模式

相反,用MS SSIS生成SSISAPI完全在线。添加每个任务或转换实例化此类对象,联系数据库。对于 OLE DB 源 - 建立到 DB 的连接,并检索列名称及其格式的列表。工作 'online' 允许您即时检索列列表(即元数据),并且在元数据上非常容易和灵活。
BIML 规定您应该以某种方式了解 BIML 生成阶段 的所有元数据,此时您可以控制进入 BIML code/package 的内容。

回到最初的问题——我们决定限制灵活性。元数据描述了 SQL 用于获取带有可选参数的数据的查询。添加了一个连接到数据库并获取列及其格式的列列表的 C# 模块,其中一个接收逻辑和条件 BIML 所需的元数据。