所以我在SQL Server中有一个存储过程。我已将其代码(针对此问题)简化为:
CREATE PROCEDURE dbo.DimensionLookup as
BEGIN
select DimensionID, DimensionField from DimensionTable
inner join Reference on Reference.ID = DimensionTable.ReferenceID
END
在SQL Server 2012上的SSIS中,我有一个带有以下源命令的Lookup组件:
EXECUTE dbo.DimensionLookup WITH RESULT SETS (
(DimensionID int, DimensionField nvarchar(700) )
)
当我在BIDS中以预览模式运行此过程时,它会正确返回两列。当我在BIDS中运行包时,它运行正常。
但是,当我将其部署到SSIS目录(数据库所在的同一服务器)时,将其指向相同的数据源等 - 它失败并显示消息:
EXECUTE语句失败,因为其WITH RESULT SETS子句为结果集编号1指定了2列,但发送的语句 运行时3列。
到目前为止的步骤:
在结果集中添加第三列 - 我得到一个不同的错误,VS_NEEDSNEWMETADATA - 这是有道理的,证明没有第三列。
SQL Profiler - 我看到了:
exec sp_prepare @p1 output,NULL,N'EXECUTE dbo.DimensionLookup WITH RESULT SETS ((
DimensionID int, DimensionField nvarchar(700)))',1
SET FMTONLY ON exec sp_execute 1 SET FMTONLY OFF
所以它试图使用FMTONLY获取结果集数据...不用说,运行SET FMTONLY ON然后在SSMS中运行命令我自己产生..只有两列。
SET NOTCOUNT ON - 没有任何变化。
所以,另外两件有趣的事情:
我将它部署到我的本地SQL 2012安装中,它工作正常,连接相同等。所以它可能是服务器/数据库配置。不确定它是什么,我没有安装开发服务器,我自己的安装几乎点击通过香草。
从DimensionTable中选择DimensionID,DimensionField
它回到结果集中只发送2列!因此,添加连接而不添加任何其他输出列会将结果集提升为3列。即使我添加了6个连接,只有3列。因此,有人猜测它是某种元数据列,只有在有连接时才会被激活。
无论如何,正如你可以想象的那样,这让我很生气。我有一个解决方法,将数据加载到临时表中,然后返回,但为什么这不起作用?什么额外的列被送回?为什么只有当我添加连接?
尔加!
答案 0 :(得分:3)
所以对billinkc的所有信任:原因在于补丁。
在版本11.0.2100.60中,使用旧的 SET FMTONLY 方法收集SSIS查找SQL命令元数据。不幸的是,这在2012年不起作用,因为the Books Online entry on SET FMTONLY有用地指出:
请勿使用此功能。此功能已被sp_describe_first_result_set取代。
太糟糕了,他们没有按照自己的建议!
自版本11.0.2218.0起已修补。使用 sp_describe_first_result_set 系统存储过程正确收集元数据。
答案 1 :(得分:0)
如果 SSIS 中指定的 WITH 结果集识别出的列数多于被调用的存储过程返回的列数,则可能会发生这种情况。检查您的存储过程并确保您拥有正确数量的输出列作为 WITH 结果集。