【问题标题】:Is there a way to ignore mapping errors in SSIS?有没有办法忽略 SSIS 中的映射错误?
【发布时间】:2020-04-16 20:44:27
【问题描述】:

我在 SSIS 中有一个数据流,它使用 ODBC 源进行条件拆分。

源根据源中数据的可用性返回一组动态列 - 列数从 1 到 13。

在我的条件拆分中,我让它指向源并将数据提供给适合其列数的目标。

例子:

条件 1 -> 将第 1 列映射到第 1 列并忽略其他 12 列 条件 2 -> 将第 1 列和第 2 列映射到第 1 列和第 2 列并忽略其他 11 列

但是,如果源仅包含 1 列,则在第二个条件下失败,因为“此路径上存在一些映射错误”

我知道列数永远不会超过 13,这意味着我可以为第 1 - 13 列设置条件。

有什么方法可以忽略映射错误或强制 SSIS 在条件拆分中的最后一个可执行案例处停止?

我个人不想深入研究脚本组件,所以如果这可以通过条件拆分来完成,我会松一口气!

有什么想法吗?

【问题讨论】:

  • SSIS 期望您的源和目标有一个确定的定义。如果 wither 没有,则不能使用数据流。这是设计使然。在我看来,如果您没有定义数据定义,那就是真正的 问题。需要对数据采用“动态”方法通常意味着存在设计缺陷。
  • 考虑到 ODBC 翻译没有任何指定列的查询,我必须面对一个真正的问题 - 返回将始终是动态的,取决于可用数据。您可能只是建议了一种动态创建数据定义的方法(这就是我本质上试图对条件拆分进行的操作)或将我指向一个资源。谢谢。
  • 当数据流中的替代方案不存在时,我无法为您指出替代方案,@Channing。就像我说的,这是设计使然。您可能会使用脚本任务自己编写解决方案,这意味着没有条件拆分或其他转换,因为它们不存在于脚本任务中;它是控制流的一部分,而不是数据流。

标签: sql-server ssis conditional-statements qodbc


【解决方案1】:

正如 Larnu 所指出的,数据流中的列数是设计时的产物,不能在运行时更改。

但是,您应该能够处理 12 个数据流。

执行 SQL 任务 -> 但是,您当前的 ODBC 源正在生成一组可变的列,请确定返回的列数。将此分配给 SSIS 变量 @[User::ColumnCount]

将来自执行 SQL 任务的 12 个输出路径附加到占源列数的自定义数据流任务。

使用@[User::ColumnCount]==1 ...==13等表达式将每个路径的优先约束更改为Constraint and Expression

SSIS 设计者将在您设计包时尝试验证元数据。运行包时的执行引擎也是如此。因此,您需要在完成设计后将每个数据流任务的延迟验证属性设置为 True。

事实上,当我更多地考虑这一点时,您希望这里的父/子包范例能更好地为您服务。为每个数据流任务设计一个包,然后让父/控制器包像我上面描述的那样调用它们。这应该会简化您在尝试构建它时遇到的元数据验证挑战。

【讨论】:

  • 这是完美的解决方案!我最终在这里使用父/子范例来绕过任何元数据验证。我知道没有定义源是一个问题,正如 Larnu 所说,但由于这是唯一与源系统兼容的 ODBC 驱动程序,所以它是我唯一的选择。我创建了 Controller 并使用先例约束来管理其他 13 个包。奇迹般有效。谢谢!
猜你喜欢
  • 2014-07-25
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
  • 2016-07-01
  • 1970-01-01
  • 2015-04-17
相关资源
最近更新 更多