我正在编写一个SSIS包,通过OLE DB Source从存储过程检索数据.存储过程包含一个相当讨厌的查询,我已经能够使用临时表来改进.如果我将这些临时表转换为表变量,则逻辑读数从大约130万跳跃到大约5600万.我对130万人感到不舒服,但是没有办法可以满足5600万条逻辑读数.因此,我无法真正将临时表转换为表变量.
但是,SSIS(或sql Server)无法解析此查询的元数据,因此该程序包将不会运行.我已经在线找到了一些不同的解决方案,但是它们似乎都不适用于sql Server 2008和sql Server 2014.我们目前正在将所有服务器升级到2014,而这一特定的软件包运行于2008年DEV,2014年在质量检查和2008年在目前的生产.到秋天,PROD层将是2014年,DEV层将在此之后推出.不幸的是,我迫不及待地等到这些升级发生,才能发布这个SSIS包.数据需要在下周开始移动.因此,我需要找出一种方法来为两个环境解析元数据.这是我迄今为止所尝试过的
>在IF 1 = 0块中添加一个虚拟选择,返回正确的元数据.这在2008年工作,但不是2014年.
>在存储过程的开头使用SET FMTONLY OFF.这个工作在2008年,但不是2014年.此外,它导致存储过程对返回的每个列运行一次(在这种情况下超过30个),即使它是有效的,这是一个破产者.
>使用EXEC … WITH RESULT SETS((…));.这在2014年工作,但不是在2008年.
>部署存储过程,返回正确的元数据,构建和部署SSIS包,然后将存储过程修改为正确的版本.这在任何一个环境中似乎都不起作用,这将使我们在ETL框架内开发的任何其他ETL应用程序变得复杂.
如果我不明白什么,我可以将不同的存储过程和程序包部署到不同的层次中,但是我更愿意这样做.一方面,这将会使未来的版本变得复杂,我也需要确保在升级服务器之后,不要忘记更新存储过程和包.
我也可以在数据库中创建真正的表,这些表将取代这些临时表.我真的不喜欢这个解决方案,但这是我能忍受的.如果我最终这样做,我将来可能会切换到使用WITH RESULT SETS.