SSIS参数化映射

问题描述 投票:0回答:2

我有一个父包,我希望用它来调用相同子包的几百个版本,以便执行从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.
sql-server ssis
2个回答
0
投票

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

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


0
投票

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.