0

SSIS - 支持我们产品的多个版本

我们的企业数据仓库整合了来自多个数据源的数据。我们有一个要求,我们应该能够同时支持从这些数据源的不同版本收集数据。

前任。客户安装了我们产品的三个不同版本 7.3、7.3.1 和 7.3.2。在这种情况下,数据仓库将在版本 7.3.2 上,但应该能够从数据源的先前版本收集数据。

我们使用存储过程将数据从源收集到我们的暂存区,然后我们将其转换并加载到仓库中。SSIS 包的设计是,有一个主包为我们从源收集数据的每个表执行包。主包根据我们需要从中收集数据的源调用,如果在运行时有三个源,则主包的三个实例将运行。这些包在仓库机器上运行以从源系统中提取数据。

我们希望在仓库中维护这些包的一个版本,并支持从不同的源版本收集数据。

挑战

  • 源系统上存储过程的签名在版本之间发生了变化
  • 在较新的版本中,这些存储过程返回了一些附加字段

例子

7.3 版本签名:[dbo].[PDW_GetMediaAgentSummary](@LastVersionID 作为 BIGINT,@InitializeDays 作为 INT = 60,@NextVersionID 作为 BIGINT 输出)

7.3 Sp1 版本签名:[dbo].[PDW_GetMediaAgentSummary](@LastVersionID AS BIGINT, @DataStartDate AS DateTime2(3), @NextVersionID AS BIGINT OUTPUT)

另外,假设在 7.3 中这个存储过程返回了 8 个字段,而 7.3 sp1 它返回了 10 个字段。

我们试图适应的方式是使用 OLE DB 源中的“SQLCmd from variable”选项来覆盖签名差异,但该选项不允许我们将参数绑定到变量以获取输出值。第二个附加字段问题(或 7.3 过程中缺少附加字段),我们尝试关闭元数据验证,但是当我们针对 7.3 版本运行 SSIS 包时,在运行时出现 field not found 错误。看起来我们可以解决的唯一方法是根据源版本复制数据流任务。寻找更好的方法来做到这一点,因为随着发布数量的增加,这可能会失控。

感谢您对此的帮助

4

1 回答 1

0

包与元数据非常紧密地绑定在一起,任何变通方法都会让人头疼。您可以对 BIML 进行一些调查,这是一种动态创建包的方法。

没有很好的方法来处理这个问题。这是一个特别丑陋的建议(只是为了突出选项并真正指出缺点):

  • 在您的数据仓库中维护一个“适用于所有版本”的临时表(在所有版本中都有所有必需的列)

  • 将每个版本的单独数据流保存在一个包中

  • 使用包中的逻辑(可能包括 .Net 脚本任务bleeergh或对系统目录的查询)来计算版本并仅运行正确的数据流

  • 根据已知版本处理“一刀切”表中的数据

对此还有其他变化。

但我认为这将是一场噩梦。

另一种选择是每个站点都有一个正确的“构建”(?)每个包都有不同的版本,并且只为站点的运行时部署正确的版本。这就是应用程序的工作方式——您拥有基于各种组件的完整“构建”。在您的情况下,构建由不同的包组成。

您的版本变体在一个包中定义(尽管每个源有许多包)

另一个难题:您可以通过在调用之前添加以下内容来停止一些存储过程列返回问题:

SET FMTONLY OFF;

简而言之,这表示“不要尝试并预先猜测存储过程中返回的列,只需运行它并使用实际返回的内容”

我们已经使用它来解决包在设计和运行时一直失败的问题,因为 SSIS认为存储过程没有返回任何列(基于 SSIS 运行 pre SET FMTONLY ON;),而实际上 SP在执行时正在返回列。

于 2015-02-05T01:52:56.363 回答