所以我在 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 中,我有一个带有以下源命令的查找组件:
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 列。所以一个猜测是它的某种元数据列只有在有连接时才会被激活。
无论如何,正如你可以想象的那样,这让我有点发疯。我有一个解决方法将数据加载到临时表中并返回它,但为什么这不起作用?什么额外的列被发回?为什么只有当我添加连接时?
呸!