【问题标题】:Are SSRS parameters fixed while generating a report?生成报告时是否固定 SSRS 参数?
【发布时间】:2018-08-13 06:22:10
【问题描述】:

我一直在我的 SQL 查询中使用以下代码:

DECLARE @CurrentDate DateTime = Getdate()

然后我引用 @CurrentDate 而不是在同一个查询中多次使用 Getdate() 函数。这很有用,因为@CurrentDate 的值在查询执行期间不会改变。

但是,我已经开始将其中一些变量转换为 SSRS 设置的参数。这允许用户更改参数@CurrentDate,这出于各种原因很有用。通常,默认值设置为“=Now()”或包含 Now() 函数的某个表达式。

这些参数是在什么阶段计算的,如果我希望参数彼此一致,是否有一种“正确”的方法来计算它们?

我试图弄清楚我是否应该为当前日期设置一个参数,然后在计算我的其他参数时引用它,或者这是否会产生与简单地使用 Now() 相同的不一致(或更严重的不一致)在每个参数的表达式中。

【问题讨论】:

  • 据我所知,只有在用户重新打开报表时才会重新计算该参数。此外,据我所知,SQL Server 目前每个查询只计算一次 GETDATE() ,但当然这种行为可能会在 SQL Server 版本之间发生变化。

标签: reporting-services


【解决方案1】:

这完全取决于您所说的“一致”是什么意思。以这两个脚本为例:

--Method #1
UPDATE tracker.shipment SET delivery_date = GETDATE() WHERE delivery_id = 1;
WAITFOR DELAY '00:00:01';
UPDATE tracker.shipment SET delivery_date = GETDATE() WHERE delivery_id = 2;

--Method #2
DECLARE @current_date DATETIME = GETDATE();
UPDATE tracker.shipment SET delivery_date = @current_date WHERE delivery_id = 1;
WAITFOR DELAY '00:00:01';
UPDATE tracker.shipment SET delivery_date = @current_date WHERE delivery_id = 2;

这是一个伪脚本,用于更新跟踪系统以显示交货时间。我认为第一个版本更“一致”,因为它记录了实际进行更新的时间,而不是从第一次输入存储过程开始的任意日期/时间。

假设有另一个系统不断检查已添加交货日期的交货项目,然后进行实际交货,或者在每次交货更新之前的代码执行某些操作以触发实际交货。在这种情况下,使用第二种方法的一致性会大大降低,因为这会将交付记录为过去一段时间,在实际交付之前。

据我所知,将评估 SSRS 发送的参数以确定用户单击“查看报告”按钮时报告服务器上的服务器时间。因此,每个具有Now() 的参数都会以相同的日期时间结束,但如果您的服务器不完全同步,这可能会稍微偏离 SQL Server。

这真的重要吗?好吧,这完全取决于您对通过的日期/时间所做的事情,我猜。当您的用户输入自定义日期/时间时,他们输入的是日期还是完整的日期/时间?我想他们只输入一个日期,所以这会自动转换为具有 00:00:00.00 时间分量?

基本上,我需要更多上下文才能对此给出更全面的答案。

【讨论】:

    【解决方案2】:

    只需创建一个日期时间 SSRS 参数并将默认值设置为 NOW()。然后它将假设一切,但用户可以选择不同的日期。另请注意,SSRS 使用 DATETIME 参数,但对于我的许多报告,我实际上使用了一个字符串参数字段,我将其转换为 DATE 以避免在用户不期望的几个小时之间丢失数据:

    WHERE CAST(StartDate AS DATE) > CAST(@StartDateParam AS DATE)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多