SSIS-sqlcmd来自源返回的变量和不同数量的字段

时间:2015-02-05 00:05:32

标签: ssis parameterbinding

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为AS BIGINT OUTPUT)

     

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”选项来覆盖签名差异,但是此选项不允许我们将参数绑定到变量以获取输出值。第二期附加字段(或7.3程序中缺少其他字段),我们试图关闭元数据验证,但是当我们针对7.3版本运行SSIS包时,我们在运行时得到字段未找到错误。看起来我们可以解决的唯一方法是根据源版本复制数据流任务。寻找更好的方法来实现这一点,因为随着版本数量的增加,这可能会失控。

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

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

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

  • 维护所有版本的作品'数据仓库中的临时表(所有版本都包含所有必需的列)

  • 在一个软件包中保留每个版本的单独数据流

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

  • 来自您的“一个尺寸”的流程数据适合所有人基于已知版本的表

还有其他变化。

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

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

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

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

SET FMTONLY OFF;

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

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