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

时间:2018-01-03 18:37:24

标签: sql sql-server ssis ssis-2008 ssis-2016

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

我目前在SSIS 2008中使用OLE DB源中的“SQL Command”数据访问模式运行此过程,如下所示。我在For Each循环容器中有这个将一系列参数值传递给存储过程,因为我每天为不同的参数值执行多次。

SET FMTONLY OFF;

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

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

我正在使用Native OLEDB SQL Server客户端。根据我的阅读,它改变了它处理多个结果集的方式。我使用WITH RESULT SETS来定义第一个结果集,但如果我执行SSIS将失败,表明需要定义其他结果集。

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

2 个答案:

答案 0 :(得分:2)

解决方案概述

我在该问题上进行了2次实验,第一次实验表明,如果存储过程没有参数,SQL Server 2016和SSIS 2016中没有任何变化,则返回第一个结果集,忽略其他结果集。

第二个实验表明,在使用参数时,这将引发异常,因此您必须使用WITH RESULT SETS选项定义元数据,然后删除此选项。

详细解决方案

实验1

以下实验是使用SQL Server 2016和Visual Studio 2015与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源中,我选择数据访问模式为SQL command
  5. 使用以下commnad

    EXEC sp_Test
    
  6. enter image description here

    1. 单击Columns选项卡时,它显示第一个ResultSet结构
    2. enter image description here

      1. 我们执行了成功运行的包
      2. enter image description here

        实验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)
        )
        )
        

        我正确地映射了参数。

        enter image description here

        enter image description here

        运行包时会抛出以下异常。

          

        [OLE DB Source 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,然后定义元数据,只需删除此选项并运行包,这样就可以成功获取第一个结果集。 / p>

答案 1 :(得分:0)

我知道它并不完全是你所要求的,但也许你可以创建另一个存储过程,它只返回给你的第一个结果集? (不触及第一个存储过程。)或者将数据插入表中,然后只读数据?