【发布时间】: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