我在SSIS 2016中创建一个执行SQL任务,该任务调用插入存储过程。我试图在输出参数中返回新创建的行的id,但面临以下错误。
没有结果行集与此查询的执行相关联
我已经设置了SQL Server Profiler以查看生成的内容,如下所示
declare @p4 int
set @p4=NULL
exec sp_executesql N'Exec [dbo].[InsertPkgAudit] @P1,@P2',N'@P1 varchar(16),@P2 int OUTPUT','CoreReferenceETL',@p4 output
select @p4
如果我手动执行以下操作
DECLARE @auditId INT;
EXEC [dbo].[InsertPkgAudit] @packageName = 'CoreReferenceETL', @auditId = @auditId OUTPUT;
PRINT @auditId;
很明显,存储过程很好但是在SSIS中调用它的方式有些问题。有人可以帮忙吗?
执行SQL任务包含以下语句
Exec [dbo].[InsertPkgAudit] @packageName =?, @auditId = ?
参数映射如下
结果窗格如下
存储过程如下:
CREATE Procedure [dbo].[InsertPkgAudit]
@packageName varchar(100),
@auditId int output
AS
BEGIN
SET NOCOUNT ON
INSERT INTO [dbo].[PkgAudit] ([PackageName], [StartTime])
VALUES (@packageName, GETDATE());
SET @auditId = SCOPE_IDENTITY();
END
表结构如下
答案 0 :(得分:0)
您告诉SSIS您的过程返回结果集。但事实并非如此。它会填充OUTPUT参数。
您可以更改proc以返回结果集,也可以修改Execute任务和
将查询更改为:
Exec [dbo].[InsertPkgAudit] @packageName =?, @auditId = ? OUTPUT
您可以找到完整的教程here。
答案 1 :(得分:0)
我只是遇到了类似的问题,在寻找某种解决方案时,我遇到了这篇老文章。我无法在线找到解决方案,但是,这是我解决问题的方式。我希望这对将来的人们有所帮助。
如果您确实需要通过RowSet传递数据,则需要选择 'ColumnName'。
Declare @fname varchar(50)
Declare @lname varchar(50)
set @fname ='John'
set @lname= 'Doe'
select @fname, @lname--without column name
select @fname as 'firstName', @lname as 'LastName'--with column name
这是它们在结果中的显示方式。
您现在可以将结果映射到适当的变量。