【问题标题】:Receive multiple result sets in stored procedure在存储过程中接收多个结果集
【发布时间】:2019-04-26 16:56:36
【问题描述】:

我有一个程序Sp1

Begin
    select product_id, product_name 
    from product

    select dept_id, dept_name 
    from department
end

我的过程返回两个结果集,现在我在另一个过程中调用这个过程:

exec SP1

如何在这个其他过程中访问SP1 的结果?

【问题讨论】:

  • “我如何将此 SP1 的结果存储在另一个过程中 这是什么意思?你不能使用#TempTable 吗?甚至更好的函数?
  • 据我所知,您只能从存储过程中捕获最后一个“结果集”。就我而言,无论如何,这完全是 hack,您应该查看用户定义的函数或输出变量以返回值。
  • 这是XY Problem。您实际上想用这些查询的结果来完成什么?

标签: sql sql-server database sql-server-2008


【解决方案1】:

可以使用INSERT INTO..EXEC 语法将结果从SP 获取到表中。但是,我不建议这样做,因为它依赖于从 SP 返回的 所有 数据集具有相同的定义:

USE Sandbox;
GO

CREATE PROC TestProc1 AS

    SELECT *
    FROM (VALUES(1,'T-Shirt'),
                (2,'Jeans'),
                (3,'Spotlight')) V(ProductID,ProductName);

    SELECT *
    FROM (VALUES(1,'Clothing'),
                (2,'Lighting')) V(DeptID, DepartmentName);
GO

CREATE TABLE #TempTable (ID int, [Name] varchar(15));

INSERT INTO #TempTable
EXEC TestProc1;

SELECT *
FROM #TempTable;

GO

DROP TABLE #TempTable
DROP PROC TestProc1;

只要您输入具有不同定义的数据集(例如,不同数量的列,或者可能无法隐式转换的值(即“abc”到int),它就会失败。例如:

USE Sandbox;
GO

CREATE PROC TestProc1 AS

    SELECT *
    FROM (VALUES(1,'T-Shirt',1),
                (2,'Jeans',1),
                (3,'Spotlight',2)) V(ProductID,ProductName,DeptID);

    SELECT *
    FROM (VALUES(1,'Clothing'),
                (2,'Lighting')) V(DeptID, DepartmentName);
GO

CREATE TABLE #TempTable (ID int, [Name] varchar(15));

--fails
INSERT INTO #TempTable
EXEC TestProc1;

SELECT *
FROM #TempTable;

GO

DROP TABLE #TempTable;
GO

CREATE TABLE #TempTable (ID int, [Name] varchar(15),OtherID int);

--fails   
INSERT INTO #TempTable
EXEC TestProc1;

SELECT *
FROM #TempTable;

GO

DROP TABLE #TempTable
DROP PROC TestProc1;

您确实应该使用多个 SP 并以这种方式处理数据。

【讨论】:

  • 第一个脚本中的第一条评论说失败,但我认为应该成功。
  • 我希望这个多重结果集在另一个存储过程中,而不是在控制器中。这两个结果集是经过大量计算得出的。
  • 你的说法很模糊。您不能在存储过程之间传递数据集。不过,您可以(再次)使用临时表。
猜你喜欢
  • 2015-04-15
  • 2011-04-22
  • 1970-01-01
  • 2014-11-10
  • 1970-01-01
  • 2013-10-06
  • 1970-01-01
  • 2015-05-27
相关资源
最近更新 更多