将动态表传递给 SSIS 中的 ADO.NET 目标
Posted
技术标签:
【中文标题】将动态表传递给 SSIS 中的 ADO.NET 目标【英文标题】:Passing dynamic table to ADO.NET Destination in SSIS 【发布时间】:2021-07-31 02:04:42 【问题描述】:我在 ADO.NET Destination 中的动态表名有问题。 控制流程为:
-
从 OLE DB 连接为我带来我需要的所有表的 SQL 查询。
迭代这些表的 Foreach 循环。
在循环内部,我有将所有数据从 OLE DB 移动到 ADO.NET 连接的数据流。
在数据流属性中,我声明了 ADO NET Destination TableOrViewName 表达式以匹配每次迭代时需要的表。
它适用于第一次迭代,但第二次失败,因为目标表没有“更新” 它仍在寻找前一个表的列。
有什么建议吗?我已经调试过了,第二个迭代表名是正确的。
【问题讨论】:
所有表是否共享相同的“形状”相同的列、相同的数据类型?否则,此方法不适用于 SSIS 不。每个表都有自己的列。但是源表也发生了变化,所以它总是应该匹配的。无论如何,有没有其他方法可以在不为每个表手动传输数据的情况下传输数据? 【参考方案1】:这就是 SSIS 数据流任务的工作方式。
SSIS 数据流的工作原理是它是一个内存中的 ETL 引擎。为了将内容保存在内存中,它在源和目标之间形成设计时契约,指定 this 很多列、这些 数据类型。
您可以动态交换源和目标连接属性(从服务器 2 数据库 B 读取,写入服务器 12,数据库 Z)但更改数据的形状(6 列而不是 7 列,所有整数而不是字符串等) 不能在运行时发生。尝试这样做会导致运行时违规,并出现错误VS_NEEDSNEWMETADATA
如果您有一个相对静态的表列表,最好的办法是为每个表创建自定义数据流。我个人的偏好是使用Biml 自动执行该任务。所以问题->ssis best practice to load N tables from Source to Target Server
在我的博客Biml - Replicate-o-matic 上,该模式的一个稍微好一点的实现是两个链接解决方案之间的唯一区别是我使用 OLE DB 连接和组件,因此更换 ADO.NET 等价物是一件小事。
【讨论】:
以上是关于将动态表传递给 SSIS 中的 ADO.NET 目标的主要内容,如果未能解决你的问题,请参考以下文章
SSIS Passing Parameters to an ADO .NET Source query;向ado.net数据源传递参数。
如何将自定义子查询传递给 ADO.NET 中的 SQL 命令?