在存储过程中接收多个结果集

时间:2018-11-24 11:10:27

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

我有一个过程Sp1

Begin
    select product_id, product_name 
    from product

    select dept_id, dept_name 
    from department
end

我的过程返回两个结果集,现在我使用以下命令在另一个过程中调用该过程:

exec SP1

如何通过此其他过程访问SP1的结果?

1 个答案:

答案 0 :(得分:2)

您可以使用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并以这种方式处理数据。