SSIS参数化映射

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SSIS参数化映射相关的知识,希望对你有一定的参考价值。

我有一个父包,我希望用它来调用相同子包的几百个版本,以便执行从ODBC数据源到SQL Server的增量加载。这是父包的屏幕截图:

Parent Package

GetTableList任务获取我想从Excel逐步加载的所有ODBC表的信息。

TableInfo

它将它存储在变量中,并使用“执行包任务”将它们传递给子包,告诉它要加载哪个表。以下是参数绑定:

Parameter Bindings

我正在使用单个子包,根据父包传递的“Table”参数(如上所示)选择要加载的表。子包控制流程如下所示。它包含(除其他外)两个数据流任务,其中:

  • 从源中将完整的主键字段集下载到临时表中
  • 下载自上次加载以来已更改的所有记录到最终表中

儿童包装控制流程:

enter image description here

它主要是工作。我已经能够使用从父包传递的参数来参数化执行SQL任务,数据流中的数据源查询,连接管理器和目标表。

但是,数据流给我一个错误。看来SSIS不会自动将源列“映射”到目标,如下所示:

Mappings

列名称和数据类型匹配。通常我会进入映射页面并直接连接它们,但因为我试图使用相同的子包加载所有表,我不能这样做 - 它必须是自动的。如何创建映射?

我尝试了this post中显示的内容,包括标记“验证外部元数据为假”。现在,映射错误都显示在OLEDB目标上:

Error: 0xC0202005 at GetKeys, dw_keys [2]: Column "codeiden" cannot be found at the datasource.

Error: 0xC0202025 at GetKeys, dw_keys [2]: Cannot create an OLE DB accessor. Verify that the column metadata is valid.

Error: 0xC004701A at GetKeys, SSIS.Pipeline: dw_keys failed the pre-execute phase and returned error code 0xC0202025.
答案

好的,我想我现在了解你了,答案是肯定的。无论包是子包,父包还是独立包,都无法在运行时动态分配目标列映射。

必须在程序包创建时分配目标列映射,并且在运行时不能更改。

另一答案

实际上,经过进一步的研究,我发现使用CozyRoc Data Flow Plus产品可以做到这一点,如this blog post中所述。

基本上,它允许您使用动态列映射创建数据流。您不能使用ODBC数据源,但可以将ADO.NET数据源与ODBC驱动程序一起使用,还可以动态映射数据转换任务以说明ADO.NET源如何强制您进入Unicode列。

看起来我甚至不需要父包,而只需要一个ForEach循环,我可以将包含表信息的RecordSet传递给我想要加载的所有表。

使用CozyRoc产品时,关键是将所有内容标记为“DelayValidation”,将所有数据流任务标记为“ValidateExternalMetadata”为false。

现在只使用试用版,并且必须确定成本是否值得。

以上是关于SSIS参数化映射的主要内容,如果未能解决你的问题,请参考以下文章

Powershell Array Strings - 在 SSIS 中映射不同的变量参数名称

访问数据库连接参数时 SSIS 作业失败

数据仓库之SSIS开发

SSIS:代码页回到 65001

操作栏选项卡:使用多次实例化的单个片段时如何传递参数

从工作 SQL 表映射多个布局 - SSIS