【问题标题】:SSRS - return multiple queries in one stored procedureSSRS - 在一个存储过程中返回多个查询
【发布时间】:2012-04-01 09:32:15
【问题描述】:

我正在尝试创建一个新的 SSRS 报告,该报告将返回并显示 SQL Server 存储过程的值。我会将参数@clientID 传递给存储过程。此参数用于 3 种不同的 BEGIN/END 语句。每个BEGIN`END` 语句都接受参数并进行查询,返回特定数据。

当我创建 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

【问题讨论】:

    标签: sql-server stored-procedures reporting-services


    【解决方案1】:

    很遗憾,这是不可能的。

    根据本书Applied Microsoft SQL Server 2008 Reporting Services
    来自Section 4.3.5 - Working with Stored Procedures

    如果存储过程返回多个行集(执行多个SELECT 语句),则报表只处理第一个行集。如果您需要所有结果,请考虑实现一个包装存储过程,该过程将多个行集合并到一个临时表中,并使用一个 SELECT 语句返回所有行。

    按照建议,您必须对存储过程进行某种调整才能完成此操作。要么创建一个包装器以在一个集合中返回所有结果,要么将现有的存储过程分成三个。

    注意:目前,您可以获得pdf of the ebook here,但它可能会被删除。

    【讨论】:

    • 感谢您的链接。我相信你——但你不认为这是一种低效的查询方式吗?我知道不是计算一次并在 3 个地方使用它,而是必须分别计算 3 次?跛脚...
    • @mikebmassey 我同意,这很蹩脚......过去计算非常昂贵时我不得不做的事情......我有第一个存储过程进行计算并保存在返回结果之前将结果放入(非临时)表中,然后让以下存储过程引用第一次调用填充的表......当然,这可能会更困难,具体取决于有多少不同版本的数据存在/并发/等...
    • 我没有考虑过使用临时表。那么,# 会存在,但 @ 不会从查询到查询?
    • @mikebmassey 实际上,两者都不会从查询到查询......所以它必须是一个非临时表。由于向报告提供了一个参数,您可以将参数值作为列包含在表格中,填充该参数的结果,然后使用该参数再次从表格中进行选择。
    • 知道了。感谢您的帮助。
    【解决方案2】:

    只需再添加一个参数:ResultSetN 并输出相应的结果集,具体取决于该参数。 1 将返回订单 2 将返回结果 3 将返回状态 然后,您可以使用相应的 # 调用您的存储过程 3 次。

    执行 pClientData @clientID ,1

    执行 pClientData @clientID ,2

    执行 pClientData @clientID ,3

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-23
      • 1970-01-01
      • 2013-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-05
      相关资源
      最近更新 更多