SSRS 中存储过程的多个数据集

问题描述 投票:0回答:5

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

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
5个回答
43
投票

不幸的是,正如文档在这里解释的那样

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

(通过这个问题找到。)

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

(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

8
投票

我一直在 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 个结果集~! 但是....我愚弄了它....

但我简单地通过改写员工姓名来创建字段,然后添加 休息(查询)因此编辑数据集属性中的字段并输入选择列名称。

然后我在参数菜单(数据集属性)中输入“EmployeeName”表达式 对于第一个数据集,“Expect”对于第二个数据集。 我也在该屏幕上匹配了@OfficeID。

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

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

所以没有对 UNION 数据集进行古怪的过滤,或者我必须在 SSRS 中处理的其他技巧,这并不有趣......(认真的 IIF?)

我看到一个存储过程,其中有大约 20 个参数,因此您可以过滤 SQL 级别的报告输出,而不是报告中的巨大拉取和过滤。

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

作为一名程序员,我觉得 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

2
投票

这里有一个技巧。这遵循

Union All
一张表的所有结果的想法,并与 SSRS 一起使用表重新发布

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

然后

Union All
想要的查询。

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

然后制作第二个 tablix 并遵循相同的操作,现在将 IIF 函数与“Address”一起使用,然后继续所需的多个不同表。


0
投票

我有一个类似的查询,其中两个结果是链接的并且需要匹配,因此如果我拉动 SP 两次,可能会有所不同。 我想将两组数据合并到一个包含两页的报告中 如果我不能,那么我将需要填充临时表并处理该临时表中的两个新 SP 我希望到 2022 年我们可以做到这一点

© www.soinside.com 2019 - 2024. All rights reserved.