如何获取 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 所需的元数据。
我正在将现有的 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 所需的元数据。