【发布时间】:2015-02-05 00:05:32
【问题描述】:
SSIS - 支持我们产品的多个版本
我们的企业数据仓库整合了来自多个数据源的数据。我们有一个要求,我们应该能够同时支持从这些数据源的不同版本收集数据。
例如。客户安装了我们产品的三个不同版本 7.3、7.3.1 和 7.3.2。在这种情况下,数据仓库的版本为 7.3.2,但应该能够从数据源的先前版本中收集数据。
我们使用存储过程将数据从来源收集到我们的暂存区,然后我们将其转换并加载到仓库中。 SSIS 包的设计是,有一个主包为我们从源收集数据的每个表执行包。主包根据我们需要从中收集数据的源调用,如果在运行时有三个源,则主包将运行三个实例。这些包在仓库机器上运行以从源系统中提取数据。
我们希望在仓库中维护这些包的一个版本,并支持从不同的源版本收集数据。
挑战
- 源系统上存储过程的签名在版本之间发生了变化
- 这些存储过程在较新版本中返回了一些附加字段
例子
7.3 版本签名:[dbo].[PDW_GetMediaAgentSummary](@LastVersionID AS BIGINT, @InitializeDays 作为 INT = 60,@NextVersionID 作为 BIGINT 输出)
7.3 Sp1 版本签名:[dbo].[PDW_GetMediaAgentSummary](@LastVersionID AS BIGINT, @DataStartDate 作为 DateTime2(3),@NextVersionID 作为 BIGINT 输出)
另外,假设在 7.3 这个存储过程返回 8 个字段,而 7.3 sp1 它返回 10 个字段。
我们尝试适应的方式是使用 OLE DB 源中的“SQLCmd from variable”选项来覆盖签名差异,但是该选项不允许我们将参数绑定到变量以获取输出值。第二个附加字段问题(或 7.3 过程中缺少附加字段),我们尝试关闭元数据验证,但是当我们针对 7.3 版本运行 SSIS 包时,在运行时出现 field not found 错误。看起来我们可以解决的唯一方法是根据源版本复制数据流任务。寻找更好的方法来做到这一点,因为随着版本数量的增加,这可能会失控。
感谢您对此的帮助
【问题讨论】:
-
除了“不要改变你的方法签名”这一明显的事后评论之外,我会看一下尼克建议的内容。使用像 Biml 这样的东西来创建元数据驱动的包开发方法。您已经捕获了
v7.3 is bigint, int, bigint output和v7.3 sp1 is bigint, datetime2(3), bigint output,因此与其在一些没有人看的文档中腐烂,不如对其进行操作。将其放入驱动程序包创建的结构中。您的主包确定要调用的包的版本,然后您将它们全部运送。 -
LOL 在某些文档中腐烂。所以非常真实。更糟糕的是:坐在一些过时的文件中伪装成真相!
标签: ssis parameterbinding