2012-03-15 106 views
6

我正在嘗試創建一個新的SSRS報告,該報告將返回並顯示SQL Server存儲過程的值。我將傳遞參數@clientID到存儲過程。此參數用於3個不同的BEGIN/END語句。每個BEGIN`END`語句接受參數並進行查詢,返回特定的數據。SSRS - 在一個存儲過程中返回多個查詢

當我創建SSRS報告時,我將數據源指向此存儲過程,但僅返回來自第一個BEGIN/END語句的結果集。如果我在SSMS中運行存儲過程,我會得到3個不同的結果集,如預期的那樣。

如何將這3 BEGIN/END結果集合到一個報告中?

示例代碼:

CREATE PROCEDURE pClientData (@clientID varchar(30)) 
AS 

    DECLARE @Orders table (
      ... 
      ); 

    DECLARE @Results table (
      ... 
      ); 

    DECLARE @Status table (
      ...  
      ); 

    BEGIN 
     SET NOCOUNT ON; 

     -- Get all the orders by client 
     INSERT INTO @Orders 
     SELECT ... 


     -- Return the results -- 
     SELECT * 
     FROM @Orders; 

    END 

    BEGIN 
     SET NOCOUNT ON; 

     -- Determine the Results 

     INSERT INTO @Results 
     SELECT ... 

     SELECT * 
     FROM @Results; 

    END 

    BEGIN 
     SET NOCOUNT ON; 

     SET @Status = (
     SELECT ... 
     ); 

     SELECT @Status as Status; 

    END 
    GO 

查詢電話從SSRS:

EXEC pClientData @clientID 

回答

5

不幸的是,這是不可能的。

據該書Applied Microsoft SQL Server 2008 Reporting Services
Section 4.3.5 - Working with Stored Procedures

如果存儲過程返回多個行集(執行多個SELECT語句),只有第一個行集由報表處理。如果您需要所有結果,請考慮實現一個包裝程序存儲過程,該過程將多個行集合合併到一個臨時表中,並返回包含一個SELECT語句的所有行。

如上所述,您必須對存儲過程進行某種調整才能完成此操作。創建一個包裝器,將所有結果返回到一個集合中,或者將現有的存儲過程分成三個。

注意:目前,你可以得到一個pdf of the ebook here,但它可能會取下來。

+0

感謝您的鏈接。我相信你 - 但你不認爲這是一種低效的查詢方式嗎?而不是計算一次並使用它3個地方,我知道必須計算3次不同的時間? Lame ... – mikebmassey 2012-03-15 20:06:50

+0

@mikebmassey我同意,這是蹩腳的...我過去必須做的事情,當計算非常昂貴時...我有第一個存儲過程進行計算,並在返回結果之前將結果保存到(非臨時)表中,然後讓以下存儲過程引用由第一次調用填充的表...當然,這可能會更困難,取決於有多少不同版本的數據存在/併發性/等等...... – 2012-03-15 20:12:26

+0

我沒有考慮使用臨時表。所以,'#'可以存活,但不能從查詢中查詢? – mikebmassey 2012-03-15 20:19:03

1

只需添加一個參數:ResultSetN並輸出相應的結果集,具體取決於該參數。 1將返回訂單 2將返回結果 3將返回狀態 然後,您可以使用相應的#調用存儲過程3次。

EXEC pClientData @clientID,1

EXEC pClientData @clientID,2

EXEC pClientData @clientID,3

相關問題