【问题标题】:Multiple data sets in stored procedure in SSRSSSRS中存储过程中的多个数据集
【发布时间】:2014-09-09 21:27:30
【问题描述】:

我有一个返回四个不同结果集的 SP,但要在 SSRS 报告中使用它,我需要以正确的方式对其进行配置。

USE LearnShare
GO

IF OBJECT_ID (N'dbo.JH_LearnShare_ActiveUsers', N'P') IS NOT NULL 
DROP PROCEDURE dbo.JH_LearnShare_ActiveUsers
GO
    CREATE PROCEDURE dbo.JH_LearnShare_ActiveUsers
        @enddate as date
    AS
    Begin
--Declare @enddate as date
--set @enddate = '6/30/2014'
    Select COUNT (distinct p.PersonID) as [Total Active Users] --50621
    FROM Enrollment E inner join 
    Person p on p.PersonID = e.[Person ID]
    WHERE p.active = 1
    and FirstLaunch between DATEADD(m,-11,DATEADD(mm, DATEDIFF(m,0,@enddate), 0)) AND @enddate
--DATEADD(m,-11,DATEADD(mm, DATEDIFF(m,0,GETDATE()), 0)) AND GETDATE()
    and [Completion Date] between  DATEADD(m,-11,DATEADD(mm, DATEDIFF(m,0,@enddate), 0))   AND @enddate
--and convert(varchar(10),[Enrollment Date] , 120) < convert(varchar(10),FirstLaunch , 120) --118669
--and FirstLaunch <> '1900-01-01 00:00:00.000' -- this doesn't matter when adding [completion date] in where clause


    Select COUNT (distinct p.PersonID) as [Total Active Online Users] --49269
    FROM Enrollment E inner join 
    Person p on p.PersonID = e.[Person ID]
    left join class c
    on e.[resource id] = c.[resource id] 
    WHERE p.active = 1
    and FirstLaunch between DATEADD(m,-11,DATEADD(mm, DATEDIFF(m,0,@enddate), 0)) AND @enddate
--DATEADD(m,-11,DATEADD(mm, DATEDIFF(m,0,GETDATE()), 0)) AND GETDATE()
    and [Completion Date] between  DATEADD(m,-11,DATEADD(mm, DATEDIFF(m,0,@enddate), 0)) AND @enddate
    and c.[Resource ID] is null 


    select COUNT (distinct p.personID) as [User with ILT courses] --22656
    from Person p 
    inner join Enrollment e on p.PersonID = e.[Person ID]
    inner join Resources r on e.[Resource ID] = r.[Resource ID]
    inner join Class c on r.[Resource ID] = c.[Resource ID]
    where p.Active = 1
    and c.[Class Date] between DATEADD(m,-11,DATEADD(mm, DATEDIFF(m,0,@enddate), 0)) AND @enddate
    and e.FirstLaunch between DATEADD(m,-11,DATEADD(mm, DATEDIFF(m,0,@enddate), 0)) AND @enddate
--DATEADD(m,-11,DATEADD(mm, DATEDIFF(m,0,GETDATE()), 0)) AND GETDATE()
    and e.[Completion Date] between  DATEADD(m,-11,DATEADD(mm, DATEDIFF(m,0,@enddate), 0)) AND @enddate


    SELECT DateName(yyyy, FirstLaunch) EnrollmentYear, DATENAME(month, FirstLaunch) AS EnrollmentMonth , Count(distinct p.PersonID) as ActiveUsers --190312
    FROM Enrollment E inner join 
    Person p on p.PersonID = e.[Person ID]
    WHERE p.active = 1
    and FirstLaunch between DATEADD(m,-11,DATEADD(mm, DATEDIFF(m,0,@enddate), 0)) AND @enddate
    and [Completion Date] between DATEADD(m,-11,DATEADD(mm, DATEDIFF(m,0,@enddate), 0)) AND @enddate
--and convert(varchar(10),[Enrollment Date] , 120) < convert(varchar(10),FirstLaunch , 120) --118669
--and FirstLaunch <> '1900-01-01 00:00:00.000' -- this doesn't matter when adding [completion date] in where clause 
    AND [Completion Date] <> '1900-01-01 00:00:00.000'
    GROUP BY DateName(yyyy,FirstLaunch) , DATENAME(month,FirstLaunch), DATEPART(MONTH,FirstLaunch)
    ORDER BY DateName(yyyy,FirstLaunch) desc , DATEPART(MONTH,FirstLaunch) DESC

    End

我试过了

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

示例添加 if (@enddate == "first") begin select..... end 但它给了我一个错误 消息 102,级别 15,状态 1,过程 JH_LearnShare_ActiveUsers,第 15 行 '=' 附近的语法不正确。

任何帮助,请。谢谢!

【问题讨论】:

  • 你到底为什么要这么做?编写一个只返回报告所需的选择的过程。
  • 我需要全部四个选择,因为我需要在报告中显示 4 个不同的结果
  • 旁注:您应该为您的存储过程使用sp_ 前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免 sp_ 并使用其他东西作为前缀 - 或者根本不使用前缀!
  • 谢谢!从现在开始会牢记这一点。我是第一次编写 SQL 存储过程的新手。另外,如果您能帮助我解决问题,那就太好了。
  • 只需创建 4 个存储过程,每个只返回 1 个结果集。然后在报表中创建 4 个数据集,每个存储过程一个。

标签: sql sql-server reporting-services dataset


【解决方案1】:

我知道这已经晚了,但也许这个回复会帮助以后有人找到这个。

可以以这种方式编写 SP,但它似乎不必要地复杂。没有理由不能只编写 4 个不同的存储过程。但是,如果您想走那条路,那将是可行的。例如:

IF @datasets = 1
begin
  select 1
end
IF @datasets = 2
begin
  select 2
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-03
    • 2018-10-31
    • 2011-07-15
    • 2016-06-16
    相关资源
    最近更新 更多