SSIS参数化映射

时间:2018-09-20 18:23:13

标签: sql-server ssis

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

Parent Package

GetTableList任务获取我要从Excel增量加载的所有ODBC表的信息。

TableInfo

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

Parameter Bindings

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

  • 从源将全套主键字段下载到暂存表中
  • 将自上次加载以来已更改的所有记录下载到最终表中

子程序包控制流程:

enter image description here

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

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

Mappings

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

我尝试了this post中显示的内容,包括标记“将外部元数据验证为false”。现在,映射错误全部显示在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.

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

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

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

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

现在仅使用试用版,就必须确定该价格是否值得。