gpt4 book ai didi

sql-server - 执行具有多个结果集的存储过程

转载 作者:行者123 更新时间:2023-12-02 05:38:09 29 4
gpt4 key购买 nike

我正在使用 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 中的功能的最佳方法是什么?

最佳答案

解决方案概述

我就这个问题做了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 命令
  5. 使用以下命令

    EXEC sp_Test

enter image description here

  • 单击“列”选项卡时,它会显示第一个结果集结构
  • enter image description here

  • 我们执行了它成功运行的包
  • 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] 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元数据,定义元数据后,只需删除此选项并运行包,这样就可以了将仅成功获取第一个结果集。

    关于sql-server - 执行具有多个结果集的存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48083262/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com