我正在编写一个SSIS包,通过OLE DB源从存储过程中检索数据。存储过程包含一个相当复杂的查询,我已经使用临时表改进了它。如果我将这些临时表切换到表变量,逻辑读取将从大约130万跳到大约5600万。尽管我对130万不太舒服,但我绝不能满足于5600万个逻辑读取。因此,我无法将临时表转换为表变量。
然而,SSIS(或者更确切地说是SQL Server)无法解析此查询的元数据,因此该程序包将无法运行。我在网上找到了一些不同的解决方案,但没有一个适用于SQL Server 2008和SQL Server 2014。我们目前正在升级所有服务器到2014年版,这个特定的包在DEV中针对2008运行,在QA中针对2014运行,在生产中目前针对2008运行。到秋天,PROD层将是2014年版本,DEV层将在此之后晋升。不幸的是,我无法等到这些升级发生才发布这个SSIS包。数据需要在下周开始移动。因此,我需要找出一种方法来解析两个环境的元数据。以下是我到目前为止尝试过的方法:
然而,SSIS(或者更确切地说是SQL Server)无法解析此查询的元数据,因此该程序包将无法运行。我在网上找到了一些不同的解决方案,但没有一个适用于SQL Server 2008和SQL Server 2014。我们目前正在升级所有服务器到2014年版,这个特定的包在DEV中针对2008运行,在QA中针对2014运行,在生产中目前针对2008运行。到秋天,PROD层将是2014年版本,DEV层将在此之后晋升。不幸的是,我无法等到这些升级发生才发布这个SSIS包。数据需要在下周开始移动。因此,我需要找出一种方法来解析两个环境的元数据。以下是我到目前为止尝试过的方法:
- 在
IF 1=0
块中添加一个虚拟的select语句,它返回正确的元数据。这在2008年版中有效,但在2014年版中无效。 - 在存储过程开头使用
SET FMTONLY OFF
。这在2008年版中有效,但在2014年版中无效。此外,它会导致存储过程针对每个返回的列(在此情况下超过30个)运行一次,即使它有效也是无法接受的。 - 使用
EXEC ... WITH RESULT SETS ((...));
。这在2014年版中有效,但在2008年版中无效。 部署一个返回正确元数据的存储过程,构建并部署SSIS包,然后将存储过程修改为正确版本。但无论在哪个环境下似乎都没有起作用,这会使我们ETL框架中开发的任何其他ETL应用变得复杂。
如果我找不到解决方案,我可以在不同的层次上部署不同的存储过程和包,但我非常不希望这样做。首先,这会使未来的发布变得更加复杂,而且一旦我们升级服务器,我还需要确保不要忘记更新存储过程和包。
我也可以在数据库中创建真实表格来代替这些临时表。我并不是很喜欢这个解决方案,但这是我能够容忍的。如果我最终采用这种方法,我可能会在将来切换到使用WITH RESULT SETS
。
然而,我个人并不太喜欢这两种解决方案,所以我想知道是否有任何我错过的解决方法,可能会更好些。
dbo.MyProc
。只是底层过程需要根据环境进行更正,是这样吗? - billinkc