SSIS 动态表和数据流中的列数

Posted

技术标签:

【中文标题】SSIS 动态表和数据流中的列数【英文标题】:SSIS Dynamic table and number of columns in data flow 【发布时间】:2019-02-26 23:57:33 【问题描述】:

我有一个表(比如表 A),其中列出了大约 10 或 15 个表,每个表都有不同的列数/名称。我需要为所有这些表创建一个遵循相同模式的数据流。 所以我在 SSIS 包中有一个 Foreach 循环,它循环遍历表 A 中的所有记录,将 10 或 15 个表的名称保存在一个变量中并执行数据流操作。

在数据流中,它注册了我给它的第一个默认表的设计,带有名称/列的编号,它工作得很好,问题是当它通过第二个表时,它有自己的列并且是它抛出一个错误的地方,说它不匹配的表的元数据或类似的东西。基本上表定义是不同的。

如何让 SSIS 动态创建这些表的设计,我真的不希望每个表有 15 个不同的数据流。

请提出建议。

【问题讨论】:

【参考方案1】:

遗憾的是,SSIS 本身不允许这种情况。 SSIS 绑定到元数据,即列名和数据类型;此外,它会在运行数据流任务之前检查匹配项。

您必须为每个表格布局创建一个数据流;您可以使用多个数据流和带有任务优先约束的条件调用来扩展您的设计。 BIML 可以帮助您根据元数据或代码生成 SSIS 包,但限制保持不变 - 数据设计必须在运行包之前修复并且不能更改

【讨论】:

非常感谢。我花了一天时间解决这个问题,您的帖子为我证实了这一点,让我不必再花时间在这个问题上。【参考方案2】:

如果我说有办法呢?

已警告您,这既缓慢又复杂! (最坏的速度是正常速度的 1/3)

1.您可以将所有列组合成一个列并从中创建一个 JSON

我们称之为 json_all。

这可以通过 information_schema 和 SSIS 中的一些动态查询来实现。

2.我们有一个只有 1 列的临时表,我们将这些数据插入到该表中。

3.我们打开 JSON 并将其插入到最终表格中。

这样您就可以为所有表提供固定的元数据。 (它们都只有 1 个名为 json_all 的列作为输出,而您的目标表只有 1 个与输入同名的列)

如果您有很多行数有限的表,这将非常有用。 (20 分钟 100 万是我的基准)

【讨论】:

以上是关于SSIS 动态表和数据流中的列数的主要内容,如果未能解决你的问题,请参考以下文章

动态改变 React Native Flat List 中的列数

将动态表传递给 SSIS 中的 ADO.NET 目标

PLSQL - 如何计算动态查询返回的列数[重复]

插入多个文本文件

无法使用 SSIS 快速加载选项从 Excel 源加载 Netezza 中的数据

在 SSIS 2012 的 OLE DB 源中使用动态 SQL