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

Reporting services SSRS中存储过程中的多个数据集,reporting-services,Reporting Services,我有一个存储过程,它返回多个结果集,如下所示 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中,在创建新报告时,我为dataset配置了存储过程。它仅使用从第一

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

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中,在创建新报告时,我为dataset配置了存储过程。它仅使用从第一个结果集返回的列创建数据集。它不标识第二个结果集

如何从上述存储过程中为两个结果集创建数据集不幸的是,如下所示:

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

(通过找到。)

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

(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

试试这样:

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

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

看起来很古怪,但它很有效

这里有一个例子

存储过程(SP)定义了2个参数 @公务人员 @数据集标志

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

下面是SP: 该报告有两个数据集,一个是我创建的,它将引入参数和EmployeeName 另一个是我创建的,它拉入EmployeeName,因为SSR只能使用1个结果集~! 但是我愚弄它

但是我简单地通过过度键入EmployeeName来创建字段,然后添加 rest(查询),因此编辑数据集属性中的字段,并输入Select列名

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

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

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

所以在联合数据集上没有古怪的过滤或者其他我必须在SSRS中处理的技巧,这一点都不有趣。。。(真的是IIF?)

我见过一个存储过程,其中我们有20个参数,因此您可以进行筛选 SQL级别的报表输出,而不是报表中的怪物拉取和筛选

不,你可以简单地创建20个存储过程,是的,但是这样,所有的代码都在一个位置,当然,它可以使用selects到临时表中合并成吨的东西, 最后,只需填充一个作为结果集的表


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

这里有一个技巧。这遵循了将所有结果合并为一个表的想法,并与SSRS repost with table一起使用

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

然后,
Union All

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


然后制作第二个tablix并按照同样的步骤操作,现在使用带“Address”的IIF函数,然后根据需要继续使用不同的表。

@Thomas:为什么不呢?(另一种方法见选项1。)@Thomas:使用联合的类似方法是使用临时表-使用每个查询的结果填充临时表,然后返回临时表的内容。很遗憾,2021年最新的SQL Server SSR仍然无法实现这一点。我们刚刚在火星上降落了一架直升机,因为我们大声呼喊!这当然是一种有效的模式,但需要对存储过程进行两次调用,这可能会影响性能。例如,假设在返回结果之前对数据进行了重要的处理,并且希望以两种不同的形状(数据集)返回该数据。两次调用SP会产生双倍的开销。不过,数据服务器上的开销最好是双倍,而不是尝试一次回调数据集,然后在SSRS中进行筛选/聚合/etc,以便在同一数据集上生成两个不同的视图。取决于与SSRS服务器相比,报表服务器的功能有多强大。而且,这篇文章非常难读。
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