带有RESEDTS SET的SSIS中的奇怪问题返回错误的列数

时间:2013-01-16 20:09:33

标签: sql-server tsql ssis sql-server-2012

所以我在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 - 没有任何变化。

所以,另外两件有趣的事情:

  1. 我将它部署到我的本地SQL 2012安装中,它工作正常,连接相同等。所以它可能是服务器/数据库配置。不确定它是什么,我没有安装开发服务器,我自己的安装几乎点击通过香草。

    1. 也许是最有趣的事情。如果我从过程的语句中删除连接,那么它就变成了
    2. 从DimensionTable中选择DimensionID,DimensionField

      它回到结果集中只发送2列!因此,添加连接而不添加任何其他输出列会将结果集提升为3列。即使我添加了6个连接,只有3列。因此,有人猜测它是某种元数据列,只有在有连接时才会被激活。

      无论如何,正如你可以想象的那样,这让我很生气。我有一个解决方法,将数据加载到临时表中,然后返回,但为什么这不起作用?什么额外的列被送回?为什么只有当我添加连接?

      尔加!

2 个答案:

答案 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 结果集。