解决方案概述
我就这个问题做了2个实验,第一个实验表明,在没有参数的存储过程的情况下,SQL Server 2016和SSIS 2016中没有任何变化,第一个结果集被返回,其他结果集被忽略。
第二个实验表明,当使用参数时,这会抛出异常,所以你必须使用定义元数据WITH RESULT SETS
选项,然后删除该选项。
详细解决方案
实验1
以下实验是使用 SQL Server 2016 和 Visual Studio 2015 以及 SSDT 2016 进行的
-
首先我创建了这个存储过程
CREATE PROCEDURE sp_Test
AS
BEGIN
SET NOCOUNT ON;
SELECT TOP 10 PersonType,NameStyle,Title
FROM [AdventureWorks2016CTP3].[Person].[Person]
SELECT TOP 10 PersonType,Firstname,Lastname
FROM [AdventureWorks2016CTP3].[Person].[Person_json]
END
GO
- 然后我向 SSIS 包添加了一个数据流任务
- 添加了 OLEDB 源、记录集目标
- 在 OLEDB 源中,我选择数据访问模式
SQL command
-
使用以下命令
EXEC sp_Test
- 单击“列”选项卡时,它会显示第一个结果集结构
- 我们执行了它运行成功的包
实验2
我将存储过程更改为以下内容:
ALTER PROCEDURE [dbo].[sp_Test]
@param1 varchar(10),
@param2 varchar(10),
@param3 varchar(10)
AS
BEGIN
SET NOCOUNT ON;
SELECT TOP 10 PersonType,NameStyle,Title ,@param2 as 'Param'
FROM [AdventureWorks2016CTP3].[Person].[Person]
SELECT TOP 10 PersonType,Firstname,Lastname,@param3 as 'Param'
FROM [AdventureWorks2016CTP3].[Person].[Person_json]
END
我在 OLEDB 源中使用了以下 SQL 命令:
EXEC sp_Test ?,?,?
WITH RESULT SETS (
(
PersonType NVarchar(10),
NameStyle NVarchar(10),
Title NVarchar(10),
Param Varchar(10)
)
)
我正确映射了参数。
运行包时会抛出以下异常。
[OLE DB 源2] 错误:SSIS 错误代码 DTS_E_OLEDBERROR。发生 OLE DB 错误。错误代码:0x80040E14。
OLE DB 记录可用。来源:“Microsoft SQL Server Native Client 11.0” Hresult:0x80040E14 描述:“EXECUTE 语句失败,因为其WITH RESULT SETS 子句指定了 1 个结果集,并且该语句尝试发送比这更多的结果集。”。
之后我尝试删除With RESULT SETS
选项,所以命令是:
EXEC sp_Test ?,?,?
我尝试再次执行该包,因此执行时没有错误。
结论
尝试使用WITH RESULT SETs
选项来定义OLEDB Source metadata
,定义元数据后,只需删除此选项并运行包,这样它就会成功获取第一个结果集。