Retrieve data from stored procedure which has multiple result sets

后端 未结 9 513
一个人的身影
一个人的身影 2020-11-30 08:47

Given a stored procedure in SQL Server which has multiple select statements, is there a way to work with those results separately while calling the procedure?

9条回答
  •  独厮守ぢ
    2020-11-30 09:18

    In TSQL land, you're stuck.

    Here is a trick (some may call semi-hacky) way that I used one time.

    /*  START TSQL CODE */
    
    /*  Stored Procedure Definition */
    
    Use Northwind
    GO
    
    
    IF EXISTS 
        (
        SELECT * FROM INFORMATION_SCHEMA.ROUTINES
        WHERE ROUTINE_TYPE = N'PROCEDURE' and ROUTINE_SCHEMA = N'dbo' and ROUTINE_NAME = N'uspOrderDetailsByCustomerId'  
        )
    BEGIN
        DROP PROCEDURE [dbo].[uspOrderDetailsByCustomerId]
    END
    
    
    GO
    
    CREATE Procedure dbo.uspOrderDetailsByCustomerId
    (
      @CustomerID nchar(5)
    , @ResultSetIndicator smallint = 0
    )
    AS
    
    BEGIN
    
        SET NOCOUNT ON
    
    
    
        /* ResultSet #1 */
    
        if (@ResultSetIndicator = 0 OR @ResultSetIndicator = 1)
        BEGIN 
            SELECT 
                c.CustomerID, c.CompanyName /*,c.ContactName,c.ContactTitle,c.[Address],c.City,c.Region,c.PostalCode,c.Country ,c.Phone,c.Fax */
            FROM 
                Customers c 
                JOIN Orders o ON c.CustomerID = o.CustomerID 
            WHERE 
                c.CustomerID = @CustomerID
        END
    
    
        /* */
        /* ResultSet #2 */ 
    
        if (@ResultSetIndicator = 0 OR @ResultSetIndicator = 2)
        BEGIN 
    
            SELECT o.OrderID,o.CustomerID /* ,o.EmployeeID,o.OrderDate,o.RequiredDate,o.ShippedDate,o.ShipVia ,o.Freight,o.ShipName,o.ShipAddress,o.OrderID,o.CustomerID,o.EmployeeID,o.OrderDate  */
            FROM 
                Orders o 
             WHERE 
                o.CustomerID = @CustomerID
            ORDER BY 
                o.CustomerID , o.OrderID 
    
        END
    
    
        /* */
        /* ResultSet #3 */
    
        if (@ResultSetIndicator = 0 OR @ResultSetIndicator = 3)
        BEGIN 
             SELECT od.OrderID,od.ProductID /* ,od.UnitPrice,od.Quantity,od.Discount  */
             FROM 
                [Order Details] od 
             WHERE 
                exists (select null from dbo.Orders  innerOrds where innerOrds.OrderID = od.OrderID and innerOrds.CustomerID = @CustomerID )
             ORDER BY 
                od.OrderID 
    
        END
    
        SET NOCOUNT OFF
    
    
    END
    
    GO 
    /* Get everything */
    
    
    exec dbo.uspOrderDetailsByCustomerId 'ALFKI'
    
    
    
    
        IF OBJECT_ID('tempdb..#TempCustomer') IS NOT NULL
        begin
                drop table #TempCustomer
        end
    
    
        CREATE TABLE #TempCustomer
        ( 
          [CustomerID] nchar(5)
        , [CompanyName] nvarchar(40)
        )
    
    INSERT INTO #TempCustomer ( [CustomerID] , [CompanyName])
    exec dbo.uspOrderDetailsByCustomerId 'ALFKI' , 1
    
    Select * from #TempCustomer
    
    
    
        IF OBJECT_ID('tempdb..#TempOrders') IS NOT NULL
        begin
                drop table #TempOrders
        end
    
    
        CREATE TABLE #TempOrders
        ( 
            OrderID int
          , [CustomerID] nchar(5)
    
        )
    
    INSERT INTO #TempOrders ( OrderID , [CustomerID] )
    exec dbo.uspOrderDetailsByCustomerId 'ALFKI' , 2
    
    Select * from #TempOrders
    
    
    
    
    
    
        IF OBJECT_ID('tempdb..#TempOrderDetails') IS NOT NULL
        begin
                drop table #TempOrderDetails
        end
    
    
        CREATE TABLE #TempOrderDetails
        ( 
            OrderID int
          , [ProductID] int
    
        )
    
    INSERT INTO #TempOrderDetails ( OrderID , [ProductID] )
    exec dbo.uspOrderDetailsByCustomerId 'ALFKI' , 3
    
    Select * from #TempOrderDetails
    
    
        IF OBJECT_ID('tempdb..#TempOrderDetails') IS NOT NULL
        begin
                drop table #TempOrders
        end
    
    
        IF OBJECT_ID('tempdb..#TempOrders') IS NOT NULL
        begin
                drop table #TempOrders
        end
    
    
    
        IF OBJECT_ID('tempdb..#TempCustomer') IS NOT NULL
        begin
                drop table #TempCustomer
        end
    

提交回复
热议问题