首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >SSRS中存储过程中的多个数据集

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

Stack Overflow用户
提问于 2012-02-16 19:47:11
回答 3查看 52.7K关注 0票数 27

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

代码语言:javascript
复制
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配置了存储过程。它只创建包含从第一个结果集返回的列的数据集。它不标识第二个结果集。

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

EN

回答 3

Stack Overflow用户

发布于 2014-10-10 06:14:44

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

看起来怪怪的,但它很有效。

下面是一个例子。

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

@OfficerID是必须输入密码或输入的Employee # (SSRS数据输入表单)。DatasetFlag是我控制在SP中执行哪条IF语句的方式。

下面是SP:

代码语言:javascript
复制
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

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

但我只是简单地通过OVERTYPING EMPLOYENAME创建字段,然后添加其余的(查询),因此编辑数据集属性中的字段并输入Select列名。

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

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

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

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

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

不,您可以简单地创建20个存储过程,是的,但是这样,所有代码都在一个位置,当然它可以使用selects into TEMP table来合并成吨的内容,最后只需填充结果集的表即可。

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

票数 8
EN

Stack Overflow用户

发布于 2012-02-16 21:52:05

试试这样的东西:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-11-05 02:41:40

这里有一个技巧可以解决这个问题。这遵循了Union All一个表的所有结果的想法,并使用SSRS repost with table

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

然后对想要的查询进行Union All

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

然后创建第二个tablix并遵循相同的方法,现在使用带有"Address“的IIF函数,然后继续使用所需的多个不同的表。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9310736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档