1

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

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

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

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

    从 DimensionTable 中选择 DimensionID、DimensionField

它回到只在结果集中发送 2 列!因此,添加一个连接,而不添加任何额外的输出列,将结果集增加到 3 列。即使我再添加 6 个连接,也只有 3 列。所以一个猜测是它的某种元数据列只有在有连接时才会被激活。

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

呸!

4

2 回答 2

3

所以所有的功劳归功于 billinkc:原因是因为一个补丁。

在版本 11.0.2100.60 中,使用旧的SET FMTONLY方法收集 SSIS 查找 SQL 命令元数据。不幸的是,这在 2012 年不起作用,因为SET FMTONLY 上的在线图书条目有帮助地指出:

请勿使用此功能。此功能已被 sp_describe_first_result_set 取代。

可惜他们没有听从自己的建议!

这已从版本 11.0.2218.0 开始修补。使用sp_describe_first_result_set系统存储过程正确收集元数据。

于 2013-01-16T22:32:56.440 回答
0

如果 SSIS 中指定的 WITH 结果集识别出比被调用的存储过程返回的列多,则可能会发生这种情况。检查您的存储过程并确保您具有正确数量的输出列作为 WITH 结果集。

于 2021-03-10T15:52:10.320 回答