Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SSIS-来自变量的sqlcmd和源返回的不同数量的字段_Ssis_Parameterbinding - Fatal编程技术网

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

SSIS-来自变量的sqlcmd和源返回的不同数量的字段,ssis,parameterbinding,Ssis,Parameterbinding,SSIS-支持我们产品的多个版本 我们的企业数据仓库整合了来自多个数据源的数据。我们有一个要求,即我们应该能够同时支持从这些数据源的不同版本收集数据 例如,客户安装了我们产品的三个不同版本7.3、7.3.1和7.3.2。在这种情况下,数据仓库将在版本7.3.2上,但应该能够从数据源的早期版本收集数据 我们使用存储过程将数据从源收集到暂存区域,然后转换并加载到仓库。SSIS包的设计是,有一个主包为我们从源中收集数据的每个表执行包。主包是根据我们需要从中收集数据的每个源调用的,如果在运行时有三个源,

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

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

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

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

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

挑战

源系统上存储过程的签名在版本之间已更改 在较新版本中,这些存储过程还返回了一些附加字段 范例

7.3版本签名:[dbo].[PDW_GetMediaAgentSummary]@LastVersionID作为BIGINT, @初始化days为INT=60,@NextVersionID为BIGINT输出

7.3 Sp1版本签名:[dbo].[PDW_GetMediaAgentSummary]@LastVersionID作为BIGINT, @DataStartDate作为DateTime23,@NextVersionID作为BIGINT输出

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

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


感谢您在这方面的帮助

软件包与元数据紧密绑定,任何解决方法都会让人头疼。您可以对BIML进行一些调查,这是一种动态创建包的方法

没有什么好办法来处理这件事。这里有一个特别难看的建议,旨在强调选项并指出缺点:

在数据仓库中维护一个“适用于所有版本”的暂存表,该表包含所有版本的所有必需列

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

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

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

这方面还有其他变化

但我认为这将是一场噩梦

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

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

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

快速启动

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


我们已使用此功能修复了一个问题,即包在设计和运行时不断失败,因为SSIS认为存储过程没有返回任何基于SSIS的列,SSIS在上运行预设的FMTONLY;,实际上,SP在执行时返回了列。

除了“请勿更改方法签名”这一明显的事后评论外,我还将按照Nick的建议看一些东西。使用诸如Biml之类的工具来创建元数据驱动的包开发方法。您已经捕获到v7.3是bigint,int,bigint输出,v7.3 sp1是bigint,datetime23,bigint输出,所以与其在一些没有人看到的文档中腐烂,不如将其操作化。将其放入驱动包创建的结构中。你的主程序包决定了什么
要调用的包的版本,然后将它们全部发送。LOL正在某个文档中腐烂。非常正确。更糟糕的是:坐在一些过时的文件里伪装成真相!非常感谢,尼克。让我试试你的一些建议,然后回来。我们研究了上面的建议。BIML看起来不错,但目前我们可能无法处理这种级别的变化。将FMTONLY设置为OFF,仍希望定义外部列和输出列。我们还尝试将scriptcomponent作为源代码,在脚本组件内部,基于我们可以填充值的版本,但这比OleDB源代码花费的时间多一倍。无论出于什么原因,OleDB源内部都应该做同样的事情,遍历结果集并填充输出缓冲区。我们也在尝试自定义OleDB源代码组件,它会表现得更好吗?我想当你已经构建了足够的自定义脚本,允许一个包使用不同版本的源代码时,你可能已经构建了一个C控制台应用程序。当你在做这样的动态事情时,SSIS很快就会失去它的优势。我建议,要么对每个源版本使用一个与元数据紧密绑定的包“构建”,也就是说,不使用动态技巧,要么在C中构建完全灵活的包,覆盖所有版本