坚持SSRS插入存储过程

时间:2013-09-27 11:57:29

标签: tsql stored-procedures ssrs-2008

我在SSRS中创建了一个更新工具,它将假日详细信息写入指定的数据库。这是通过使用插入存储过程作为报表中的数据集创建的。只要我只想指定单个日期,一切正常。理想情况下,虽然我需要这个做日期范围。我有以下需要的列:

HolidayDate|StaffCode|HolidayType|FTE

我知道这最好用.net或类似的东西完成,但这有点超出我的技能范围。我需要的是一个多参数存储过程,它将根据在SSRS中选择日期范围为每个日期创建记录。标准的SSRS报告很简单,很简单BETWEEN @DATE AND @DATE但是我无法弄清楚如何将它放入我的设置中并且我感到沮丧。

希望我没有太模糊。

1 个答案:

答案 0 :(得分:0)

问题的关键在于你真的需要能够得到开始/结束日期之间的日期列表。

保持简单,假设您有报告参数@StartDate@EndDate@StaffCode,其值为 01-Jan-2013 分别于2013年1月5日 Staff1

您的SP将有三个相应的参数 - 根据这些参数,我们可以为SP中的StaffCode建立一个天数列表。

这是一种方法:

create procedure MySP
(
  @StartDate date
  , @EndDate date
  , @StaffCode varchar(10)
) as

with dates as
(
  select HolidayDate = @startDate
  union all
  select HolidayDate = dateadd(dd, 1, HolidayDate)
  from dates
  where dateadd(dd, 1, HolidayDate) <= @EndDate
)
insert into HolidayDates
select HolidayDate, StaffCode = @StaffCode
from dates;

因此,这会为@StartDate@EndDate的每个日期插入一行。

这只是一个例子,我用一个递归的CTE来设置日期 - 如果你有一个日历或数字表,你可以用它来代替;那里有很多例子。

另一种方法是基于日期参数构建基于循环的集合:

create procedure MySP
(
  @StartDate date
  , @EndDate date
  , @StaffCode varchar(10)
) as

declare @Dates table (HolidayDate date)

while (@StartDate <= @EndDate)
begin

  insert into @Dates select @StartDate
  select @StartDate = dateadd(dd, 1, @StartDate)

end

insert into HolidayDates
select HolidayDate, StaffCode = @StaffCode
from @Dates;

你自己说过这不是一个理想的工作流程 - SSRS并不是一个真正的数据输入机制,但是在大多数情况下上述原因并不适用。