我正在使用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中有效的最佳方法是什么?
答案 0 :(得分:2)
我在该问题上进行了2次实验,第一次实验表明,如果存储过程没有参数,SQL Server 2016和SSIS 2016中没有任何变化,则返回第一个结果集,忽略其他结果集。
第二个实验表明,在使用参数时,这将引发异常,因此您必须使用WITH RESULT SETS
选项定义元数据,然后删除此选项。
以下实验是使用SQL Server 2016和Visual Studio 2015与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
SQL command
使用以下commnad
EXEC sp_Test
我将存储过程更改为以下内容:
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]错误: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)
我知道它并不完全是你所要求的,但也许你可以创建另一个存储过程,它只返回给你的第一个结果集? (不触及第一个存储过程。)或者将数据插入表中,然后只读数据?