使用多个结果集执行存储过程

Execute Stored Procedure with multiple result sets

我正在使用 SSIS 2016。我需要执行一个包含 returns 4 个结果集的存储过程。我只需要保留第一个结果集并将其写入table。我无法修改存储过程。我不关心其他结果集中返回的任何数据。存储过程位于 SQL Server 2016 数据库中。结果也将驻留在 SQL Server 2016 中。

我目前在 SSIS 2008 中使用 "SQL Command" 数据访问模式在 SSIS 2008 中执行此过程,如下所示。我在 For Each Loop Container 中有这个,以将一系列参数值传递给存储过程,因为我每天针对不同的参数值多次执行它。

SET FMTONLY OFF;

EXEC myProc
     @Param1 = ?,
     @Param2 =?,
     @Param3 = ?;

默认情况下,SSIS 2008 仅返回第一个结果集,这对我有用,因为我只关心第一个结果集。

我正在使用本机 OLEDB SQL 服务器客户端。据我所知,它改变了处理多个结果集的方式。我已经使用 WITH RESULT SETS 来定义第一个结果集,但是如果我执行 SSIS 将失败,表明需要定义其他结果集。

简而言之,将 SSIS 2008 中有效的内容复制到 SSIS 2016 的最佳方法是什么?

我知道这不完全是您要的,但也许您可以创建另一个存储过程,它 return 只会为您提供第一个结果集? (不触及第一个存储过程。)或者为您将数据插入 table 然后您只读取数据?

解决方案概述

我在这个问题上做了 2 个实验,第一个实验表明,在没有参数的存储过程的情况下,SQL Server 2016 和 SSIS 2016 没有任何变化,第一个结果集被返回,其他的是忽略。

第二个实验表明,当使用参数时,这会抛出异常,所以你必须使用WITH RESULT SETS选项定义元数据,然后删除这个选项。


详细解决方案

实验 1

以下实验使用SQL Server 2016和Visual Studio 2015 with SSDT 2016

  1. 首先我创建了这个存储过程

    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
    
  2. 然后我在 SSIS 包中添加了一个数据流任务
  3. 添加了 OLEDB 源、记录集目标
  4. 在 OLEDB source i select 中数据访问模式为 SQL command
  5. 使用以下命令

    EXEC sp_Test
    

  1. 单击“列”选项卡时,会显示第一个结果集结构

  1. 然后我们成功执行了包 运行s

实验二

我将存储过程更改为以下内容:

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 Source 2] Error: SSIS Error Code DTS_E_OLEDBERROR. An OLE DB error has occurred. Error code: 0x80040E14. An OLE DB record is available. Source: "Microsoft SQL Server Native Client 11.0" Hresult: 0x80040E14 Description: "EXECUTE statement failed because its WITH RESULT SETS clause specified 1 result set(s), and the statement tried to send more result sets than this.".

之后我尝试删除 With RESULT SETS 选项,所以命令是:

EXEC sp_Test ?,?,?

我尝试再次执行包,所以没有错误执行。

结论

尝试使用WITH RESULT SETs选项来定义OLEDB Source metadata,定义元数据后,只需删除此选项和运行包,这样就只需要第一个结果集成功。