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

时间:2012-02-16 11:47:11

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

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

4 个答案:

答案 0 :(得分:36)

不幸的是,正如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

答案 1 :(得分:7)

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

看起来很糟糕,但它确实有效......

这是一个例子。

存储过程(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

REPORT有2个数据集,我创建了一个数据集,它将引入参数和EmployeeName 我创建的另一个,它拉入EmployeeName,因为SSRS只能使用1个结果集〜! 但是......我愚弄了....

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

然后我使用PARAMETERS菜单(数据集属性)输入=“EmployeeName”的EXPRESSION 对于第一个数据集和=“期望”为第二个。我也在那个屏幕上匹配@OfficeID。

然后当我运行这个......它要求发送PersonID(RS创建输入表单) 当我输入ID并点击VIEW REPORT。或者我们可以使用OfficerID的所有RDL,就像SSRS表单一样,但是在ASPX页面中。

返回两个数据集(它称之为两次是我的假设)

所以不要对UNION数据集或其他技巧进行过滤,我必须在SSRS中处理,这不好玩......(严重的是IIF?)

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

不能简单地创建20个存储过程,好的,但是这样,所有代码都在一个位置,当然它可以使用选择到TEMP表来合并大量的东西, 最后只需要一个表格,即RESULT SET ..

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

答案 2 :(得分: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

答案 3 :(得分:2)

HEre就是这样的一招。这遵循“联合所有”的想法,一个表的所有结果,并与表

的ssrs重新发布一起使用

对于每个单独的查询,添加一列显示查询的目的对于例如“name”或“address”,将为每行查询重复此信息。

然后联盟所有想要的查询。

在Visual studio / ssrs报告中:添加包含storedprocedure的数据集。然后从工具中选择Tablix并将所需数据拖动到tablix列。然后转到tablix行属性 - >行可见性。因为那里使用IFF函数的排序子句只显示在查询时具有先前定义的额外列的行,例如“Name” 然后制作第二个tablix并按照相同的方法,现在使用IIF函数和“Address”,然后继续作为manu不同的表格。