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

问题描述 投票:3回答:2

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

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

SET FMTONLY OFF;

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

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

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

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

sql sql-server ssis ssis-2008 ssis-2016
2个回答
2
投票

Solution Overview

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

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


Detailed Solution

实验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源,Recordset目标
  4. 在OLEDB源中,我选择数据访问模式为SQL command
  5. 使用以下命令 qazxsw poi

EXEC sp_Test

  1. 单击“列”选项卡时,它将显示第一个ResultSet结构

enter image description here

  1. 我们执行它成功运行的包

enter image description here

实验2

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

enter image description here

我在OLEDB源中使用了以下SQL命令:

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

我正确地映射了参数。

EXEC sp_Test ?,?,? WITH RESULT SETS ( ( PersonType NVarchar(10), NameStyle NVarchar(10), Title NVarchar(10), Param Varchar(10) ) )

enter image description here

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

[OLE DB Source enter image description here]错误:SSIS错误代码DTS_E_OLEDBERROR。发生OLE DB错误。错误代码:0x80040E14。 OLE DB记录可用。来源:“Microsoft SQL Server Native Client 11.0”Hresult:0x80040E14说明:“EXECUTE语句失败,因为其WITH RESULT SETS子句指定了1个结果集,并且该语句试图发送比此更多的结果集。”

之后,我试图删除2选项,所以命令是:

With RESULT SETS

我试图再次执行包,因此执行时没有错误。

结论

尝试使用EXEC sp_Test ?,?,? 选项来定义WITH RESULT SETs,之后定义元数据,只需删除此选项并运行包,因此它将成功获取第一个结果集。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.