【问题标题】:Stuck on SSRS insert stored proc卡在 SSRS 插入存储过程
【发布时间】:2023-03-09 08:42:01
【问题描述】:

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

HolidayDate|StaffCode|HolidayType|FTE

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

希望我没有太含糊。

【问题讨论】:

    标签: tsql stored-procedures ssrs-2008


    【解决方案1】:

    这里的关键是您确实需要能够获得开始/结束日期之间的日期列表。

    保持简单,假设您有报告参数@StartDate@EndDate@StaffCode,其值为01-Jan-201305-Jan-2013 和 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 并不是真正的数据输入机制,但没有理由在大多数情况下上述方法不起作用。

    【讨论】:

    • 实际上认为 CTE 可以工作,报表可以创建基础数据,然后存储过程的其余部分可以通过 CTE 转换数据。现在只需要弄清楚CTE!不过,将作为单独的问题发布。感谢您的启发。
    • 没问题!如果您不想使用 CTE,您甚至可以通过循环获取日期列表;见上文。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多