【问题标题】:Multiple Datasets from Stored Procedure in SSRS来自 SSRS 中存储过程的多个数据集
【发布时间】:2012-02-16 11:47:10
【问题描述】:

我有一个返回多个结果集的存储过程,如下所示

CREATE StoredProcedure sp_MultipleDataSets
AS
BEGIN
    SELECT EMPID, ENAME, JOB, SAL, DEPTID FROM EMP -- first result set
    SELECT DEPTID, DNAME, LOC FROM DEPT --second result set
END

在 BIDS 中,在创建新报表时,我为数据集配置了存储过程。它仅使用从第一个结果集返回的列创建数据集。它不识别第二个结果集。

如何通过上述存储过程为两个结果集创建数据集

【问题讨论】:

    标签: reporting-services


    【解决方案1】:

    不幸的是,作为documentation explains here

    如果通过单个查询检索多个结果集,则仅处理第一个结果集,而忽略所有其他结果集。

    (通过this question找到。)

    因此,我建议使用以下两种可能性之一:

    (1) 将该过程拆分为两个单独的过程 - 一个从 EMP 返回数据,一个从 DEPT 返回数据 - 并将新过程作为两个单独的数据集访问。

    (2) 合并两个单独的查询(用一个额外的列指示生成每一行的查询)并适当地过滤或有条件地格式化您的报告。联合查询可能如下所示:

    SELECT EMPID ID, ENAME NAME, JOB JOB_LOC, SAL, DEPTID, 'EMP' SOURCE 
    FROM EMP
    UNION ALL
    SELECT DEPTID ID, DNAME NAME, LOC JOB_LOC, NULL SAL, DEPTID DEPTID, 'DEPT' SOURCE
    FROM DEPT
    

    【讨论】:

    • @Thomas:为什么不呢? (请参阅选项 1 了解替代方案。)
    • @Thomas:使用联合的类似方法是使用临时表 - 用每个查询的结果填充临时表,然后返回临时表的内容。
    • 真的很遗憾,2021 年最新的 SQL Server SSRS 仍然无法做到这一点。我们刚刚在火星上降落了一架直升机,大声呼喊!
    【解决方案2】:

    我一直使用 SP 中的参数来拉取 SSRS 中的多个结果集。 您必须通过 SP 中的 IF 语句将它们分开,然后您必须在 SSRS 数据集设置中手动输入字段。

    看起来很奇怪,但它确实有效......

    这是一个例子。

    存储过程(SP) 定义了 2 个参数 @OfficerID @DatasetFlag

    @OfficerID 是必须通过或输入的员工编号(SSRS 数据输入表单) DatasetFlag 是我控制在 SP 中执行哪个 IF 语句的方式。

    所以这里是 SP:

    CREATE PROCEDURE [dbo].[StoredProcedureNameHere]
        @OfficerID  VARCHAR(7),
    @DatasetFlag    VARCHAR(60)   
    
    WITH RECOMPILE
    AS
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 
    SET NOCOUNT ON;
    
    BEGIN TRY
    IF @DatasetFlag = 'EmployeeName'
        Begin
            SELECT [EmployeeName]
            FROM [DatabaseName].[scema].[Employee]
            where EmployeeBNumber = @OfficerID
        END
    ELSE
    IF @DatasetFlag = 'Expect'
        Begin
            SELECT 
                [TerritoryName]
                ,[TestNumber]
                ,[RuleNumber]
                ,[Expectation]
                ,[TestCount]
                ,[PercentToGoal]
            FROM    [Database].[scema].[Table2]
            WHERE OfficerID = @OfficerID
            ORDER BY TerritoryID
                    ,TestNumber
                    ,RuleNumber
        END
    
    RETURN
    GO
    

    报告有 2 个数据集,一个是我创建的,它将拉入参数和 EmployeeName 我创建的另一个它会拉入 EmployeeName,因为 SSRS 只能使用 1 个结果集~! 但是....我把它骗了....

    但我通过 OVERTYPING EMPLOYENAME 来简单地创建字段,然后添加 rest (Query) 所以编辑 DATASET 的 PROPERTIES 中的 FIELDS 并放入 Select Column Names。

    然后我在 PARAMETERS 菜单(数据集属性)中输入 ="EmployeeName" 的表达式 第一个数据集和第二个“期望”。我也在那个屏幕上匹配了@OfficeID。

    然后当我运行它时...它要求提供 OfficerID(RS 创建输入表单) 当我输入 ID 并点击查看报告时。或者,我们可以像 SSRS 表单一样,使用 OfficeID 的所有 RDL,但在 ASPX 页面中。

    返回两个数据集(它调用了两次是我的假设)

    因此,我必须在 SSRS 中处理 UNION 数据集或其他技巧,这并不有趣……(真的是 IIF?)

    我看到一个存储过程,我们有 20 个参数,所以你可以过滤 SQL 级别的报表输出,而不是报表中的怪物拉取和过滤。

    不,你可以简单地创建 20 个存储过程,好吧,但是这样,所有的代码都在一个位置,当然它可以使用选择到 TEMP 表中来合并大量的东西, 最后简单地填充一个作为结果集的表..

    作为一名程序员,我觉得 SSRS 有点古怪,但到目前为止,我很开心,试图找到获得我想要的东西的方法,而不是它提供的东西......

    【讨论】:

    • 这当然是一个有效的模式,但需要两次调用存储过程,这可能会影响性能。例如,假设您在返回结果之前对数据进行了大量处理,并且您希望以两种不同的形状(数据集)返回该数据。调用 SP 两次会产生双倍的开销。
    • 最好在数据服务器上拥有两倍的开销,而不是尝试一次拉回数据集并在 SSRS 中进行过滤/聚合/等以在同一数据集上生成两个不同的视图, 尽管。取决于您的报告服务器与 SSRS 服务器相比有多强大。此外,这篇文章非常难以阅读。
    【解决方案3】:

    试试这样的:

    Create StoredProcedure sp_MultipleDataSets(@Param nvarchar(10))
    as
    begin
       if(@Param == "first")
          begin
             SELECT EMPID, ENAME, JOB, SAL, DEPTID FROM EMP -- first result set
          end
       if(@Param == "second")
          begin
            SELECT DEPTID, DNAME, LOC FROM DEPT --second result set
          end
    end
    

    【讨论】:

      【解决方案4】:

      这里有一个技巧。这遵循Union All 一个表的所有结果的想法,并与 SSRS 一起使用表重新发布

      为每个单独的查询添加一列,其中显示查询的目的例如“姓名”或“地址”,每行查询都会重复此信息。

      然后Union All 想要的查询。

      在 Visual Studio / SSRS 报告中:添加包含存储过程的数据集。然后从工具中选择 tablix 并将所需数据拖动到 tablix 列。然后转到 tablix 行属性 -> 行可见性。因为使用 IFF 函数使排序子句仅在查询中显示具有先前定义的额外列的行,例如“名字”

      然后制作第二个 tablix 并遵循相同的方法,现在使用带有“地址”的 IIF 函数,然后继续所需的多个不同表。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-09
        • 1970-01-01
        • 2016-10-16
        • 1970-01-01
        • 1970-01-01
        • 2011-12-13
        • 1970-01-01
        • 2018-10-31
        相关资源
        最近更新 更多