2012-03-15 12 views
6

Estoy intentando crear un nuevo informe SSRS que devolverá y mostrará los valores de un procedimiento almacenado de SQL Server. Pasaré un parámetro @clientID al procedimiento almacenado. Este parámetro se usa en 3 declaraciones diferentes BEGIN/END. Cada instrucción BEGIN `END` toma el parámetro y realiza una consulta, devolviendo datos específicos.SSRS - devuelve varias consultas en un procedimiento almacenado

Cuando creo el informe SSRS, apunto el origen de datos a este procedimiento almacenado, pero solo se devuelve el conjunto de resultados de la primera declaración BEGIN/END. Si ejecuto el procedimiento almacenado en SSMS, obtengo 3 conjuntos de resultados diferentes, como se esperaba.

¿Cómo puedo obtener esos 3 BEGIN/END conjuntos de resultados en un solo informe?

Código de ejemplo:

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 

llamada de consulta de SSRS:

EXEC pClientData @clientID 

Respuesta

5

Por desgracia, esto no es posible.

Según el libro Applied Microsoft SQL Server 2008 Reporting Services
De Section 4.3.5 - Working with Stored Procedures:

Si un procedimiento almacenado devuelve varios conjuntos de filas (ejecuta múltiples SELECT declaraciones), sólo el primer conjunto de filas es procesada por el informe. Si necesita todos los resultados, considere implementar un procedimiento almacenado contenedor que combine los conjuntos de filas múltiples en una tabla temporal y devuelva todas las filas con una sola declaración SELECT.

Según lo sugerido, tendrá que hacer algún tipo de ajuste en su procedimiento almacenado para lograr esto. Cree un contenedor para devolver todos los resultados en un solo conjunto o divida su procedimiento almacenado existente en tres.

Nota: Por el momento, se puede obtener una pdf of the ebook here, pero puede ser que consiga tomado abajo.

+0

Gracias por el enlace. Te creo, pero ¿no crees que es una forma ineficiente de consultar? En lugar de calcular algo una vez y usarlo en 3 lugares, sé que debo calcularlo 3 veces por separado. Lame ... – mikebmassey

+0

@mikebmassey Estoy de acuerdo, es cojo ... algo que he tenido que hacer en el pasado cuando un cálculo es muy caro ...Tengo el primer procedimiento almacenado hacer el cálculo y guardar los resultados en una tabla (no temporal) antes de devolver su resultado, y luego hacer que los siguientes procedimientos almacenados hagan referencia a la tabla que fue poblada por la primera llamada ... Por supuesto, esto puede ser más difícil dependiendo de cuántas versiones diferentes de los datos existen/concurrencia/etc ... –

+0

No pensé en usar una tabla temporal. Entonces, '#' podría vivir, pero no '@' de la consulta a la consulta? – mikebmassey

1

Solo agregue un parametro más: ResultSetN y el conjunto de resultados correspondiente a la salida, dependiendo de ese parámetro. 1 devolverá Pedidos 2 devolverá Resultados 3 devolverá Estado A continuación, puede llamar a su procedimiento almacenado 3 veces con # correspondiente.

EXEC pClientData @clientID, 1

EXEC pClientData @clientID, 2

EXEC pClientData @clientID, 3

Cuestiones relacionadas