SSIS参数化映射
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SSIS参数化映射相关的知识,希望对你有一定的参考价值。
我有一个父包,我希望用它来调用相同子包的几百个版本,以便执行从ODBC数据源到SQL Server的增量加载。这是父包的屏幕截图:
GetTableList任务获取我想从Excel逐步加载的所有ODBC表的信息。
它将它存储在变量中,并使用“执行包任务”将它们传递给子包,告诉它要加载哪个表。以下是参数绑定:
我正在使用单个子包,根据父包传递的“Table”参数(如上所示)选择要加载的表。子包控制流程如下所示。它包含(除其他外)两个数据流任务,其中:
- 从源中将完整的主键字段集下载到临时表中
- 下载自上次加载以来已更改的所有记录到最终表中
儿童包装控制流程:
它主要是工作。我已经能够使用从父包传递的参数来参数化执行SQL任务,数据流中的数据源查询,连接管理器和目标表。
但是,数据流给我一个错误。看来SSIS不会自动将源列“映射”到目标,如下所示:
列名称和数据类型匹配。通常我会进入映射页面并直接连接它们,但因为我试图使用相同的子包加载所有表,我不能这样做 - 它必须是自动的。如何创建映射?
我尝试了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参数化映射的主要内容,如果未能解决你的问题,请参考以下文章