2012-03-15 29 views
6

Tôi đang cố gắng tạo một báo cáo SSRS mới sẽ trả về và hiển thị các giá trị của một thủ tục lưu sẵn SQL Server. Tôi sẽ chuyển một tham số @clientID đến thủ tục được lưu trữ. Tham số này được sử dụng trong 3 câu lệnh BEGIN/END khác nhau. Mỗi câu lệnh BEGIN `END` lấy tham số và tạo truy vấn, trả về dữ liệu cụ thể.SSRS - trả về nhiều truy vấn trong một thủ tục đã lưu

Khi tôi tạo báo cáo SSRS, tôi trỏ nguồn dữ liệu đến quy trình được lưu trữ này, nhưng chỉ kết quả được đặt từ câu lệnh BEGIN/END đầu tiên được trả về. Nếu tôi chạy thủ tục lưu sẵn trong SSMS, tôi nhận được 3 tập kết quả khác nhau, như mong đợi.

Làm cách nào để có được các kết quả 3 BEGIN/END này thành một báo cáo?

Mẫu mã:

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 

gọi Query từ SSRS:

EXEC pClientData @clientID 

Trả lời

5

Thật không may, điều này là không thể.

Theo cuốn sách Applied Microsoft SQL Server 2008 Reporting Services
Từ Section 4.3.5 - Working with Stored Procedures:

Nếu một thủ tục lưu trữ trả về nhiều rowsets (thực hiện nhiều SELECT báo cáo), chỉ có rowset đầu tiên được xử lý bởi báo cáo. Nếu bạn cần tất cả các kết quả, hãy xem xét việc thực hiện một thủ tục được lưu trữ bao bọc để kết hợp nhiều hàng trong một bảng tạm thời và trả về tất cả các hàng với một câu lệnh SELECT.

Như được đề xuất, bạn sẽ phải thực hiện một số loại điều chỉnh cho quy trình được lưu trữ của mình để thực hiện việc này. Tạo trình bao bọc để trả về tất cả các kết quả trong một tập hợp đơn lẻ hoặc chia quy trình được lưu trữ của bạn thành ba.

Note: Tại thời điểm này, bạn có thể có được một pdf of the ebook here, nhưng nó có thể được đưa xuống.

+0

Cảm ơn bạn đã liên kết. Tôi tin bạn - nhưng bạn không nghĩ đó là một cách không hiệu quả để truy vấn? Thay vì tính toán một cái gì đó một lần và sử dụng nó 3 nơi, tôi biết phải tính toán nó 3 lần riêng biệt? Lame ... – mikebmassey

+0

@mikebmassey Tôi đồng ý, đó là một điều mà tôi đã phải làm trong quá khứ khi tính toán rất tốn kém ...Tôi có thủ tục lưu trữ đầu tiên thực hiện phép tính và lưu kết quả vào một bảng (không tạm thời) trước khi trả về kết quả của nó, và sau đó có các thủ tục được lưu trữ sau đây tham chiếu đến bảng đã được điền bởi lệnh gọi đầu tiên ... Tất nhiên, điều này có thể khó khăn hơn tùy thuộc vào bao nhiêu phiên bản khác nhau của dữ liệu tồn tại/đồng thời/etc ... –

+0

Tôi không nghĩ đến việc sử dụng bảng tạm thời. Vì vậy, '#' sẽ sống, nhưng không phải '@' từ truy vấn đến truy vấn? – mikebmassey

1

Chỉ cần thêm một tham số nữa: ResultSetN và tập hợp kết quả sửa lỗi đầu ra, tùy thuộc vào thông số đó. 1 sẽ trả lại Đơn hàng 2 sẽ trả về Kết quả 3 sẽ trả về Trạng thái Sau đó bạn có thể gọi thủ tục được lưu trữ của bạn 3 lần với số # tương ứng.

EXEC pClientData @clientID, 1

EXEC pClientData @clientID, 2

EXEC pClientData @clientID, 3

Các vấn đề liên quan