使用多个结果集执行存储过程
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
首先我创建了这个存储过程
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 source i select 中数据访问模式为
SQL command
使用以下命令
EXEC sp_Test
- 单击“列”选项卡时,会显示第一个结果集结构
- 然后我们成功执行了包 运行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
,定义元数据后,只需删除此选项和运行包,这样就只需要第一个结果集成功。
我正在使用 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
首先我创建了这个存储过程
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 source i select 中数据访问模式为
SQL command
使用以下命令
EXEC sp_Test
- 单击“列”选项卡时,会显示第一个结果集结构
- 然后我们成功执行了包 运行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
,定义元数据后,只需删除此选项和运行包,这样就只需要第一个结果集成功。