在 SSRS 中,预览中的日期时间参数与部署的报表不匹配

In SSRS, a Date Time parameter on Preview is not matching the deployed report

在 SSRS 中,预览中的日期时间参数与部署的报表不匹配。这是别人遇到过的吗? RDL 代码是相同的。事实上,有时候,本地预览只是功能的模拟吗?是因为预览中的显示有时会使用缓存数据吗?

我有一个 SSRS 报告,当我在 Visual Studio 本地预览它时,日期显示为 2/10/2019 但当 RDL 代码部署在服务器上时,日期显示为 2/ 2019 年 7 月 日期时间变量基于报表上的一个参数,称为 运行date,它的默认值为 2/10/2019。 所以我认为在预览模式下本地发生的报表服务器上应该发生同样的事情。

该报告有四个数据集,作为测试,我将每四个数据集设置为具有 SQL 行来设置 运行 日期值,如下所示: SET @运行date = '2019-02-10' 但是在报表服务器上,当我加载报表时,它会抛出此错误: 必须声明标量变量“@运行date”。必须声明标量变量“@运行date”。 它位于级联选项卡式错误消息中,如下所示: 客户端呈现期间发生错误。 报告处理期间发生错误。 数据集“ThirdDataset”的查询执行失败。 必须声明标量变量“@运行date”。必须声明标量变量“@运行date”。

那么,为什么它 运行 在本地而不是在服务器上? "ThirdDataset" 是我在这里给出的假名。实际名称已编辑。但是,我注意到这将是第一个数据集 运行 如果它们按字母顺序排列 运行。所以这让我想到了一个问题:为什么报告不承认这是一个参数,为什么它抱怨它没有声明?

============

更新:

我已将 运行日期设置为报告中数据驱动订阅的一部分,如下所示:

SELECT 将 (date, DATEADD (DAY, -2 , SYSDATETIME())) 转换为 运行date

这是两天前的事了。由于今天是 2/11/2019,因此传递给服务器上的 SSRS 报告的 运行date 参数应该是 2/9/2019。

为了好玩,为了对此进行测试,我将默认值 运行 日期参数设置为 2018 年 8 月 8 日,希望数据驱动报告能够正确设置它。

在 Visual Studio 的本地预览模式下,设置为显示 [@运行date] 表达式的文本框显示 8/8/2018,这是我所期望的,但数据集是设计为 运行 关闭此参数。由于 sql 不应该从那么旧的数据库中检索任何内容,因此预览模式下的图形和图表应该完全是空的。他们为什么要显示数据?!

接下来,让我们看看通过电子邮件发送的订阅提醒是怎么说的。它的日期是 2/11/2019 12:00:00 AM。如果数据驱动订阅 运行 应该 运行 喜欢它,它的日期应该是

2/9/2019

SELECT 将 (date, DATEADD (DAY, -2 , SYSDATETIME())) 转换为 运行date

为什么这不起作用?

在 SSRS 服务器上,RDL 文件的参数默认值为 2/11/2019 12:00:00 AM 但是为什么报告会得到这个默认值?我做错了什么,我该如何解决?

作为测试,我将这个默认的 date/time 参数设置为 12:12:34,看看会发生什么。它显示,是的,这是发送到报告的日期时间戳。所以我取消选中 "Has Default" 框

然后,我注意到在数据驱动订阅的第 5 步中,如果不进行小的更改,我无法前进到下一步 >:

那么,应该怎么办?它会显示古怪的 8/8/2018 值吗?会显示两天前的日期吗?

报表参数的默认值只部署到报表服务器一次,在后续部署后保持默认值。这样一来,开发中使用的默认参数值就不会覆盖生产服务器上所需的参数默认值。

因此,当报表首次部署时,@rundate 的默认值似乎是 2/7/2019,但此后在本地报表上已更改为 2/10/2019。进入你的报表服务器,找到报表并进入报表参数部分编辑参数并将默认值更改为你想要的值(从报表服务器删除报表并使用更新的参数重新部署它会具有相同的效果,但请注意,该参数将在以后保持默认值)。或者,使用表达式设置报告参数,使其不断更新。

关于使用 SET 语句更新 Sql 语句中的参数值,您实际上不能那样做 - 您需要在报表的参数列表中设置它,以便 SSRS 可以设置参数价值。因此,您的数据库服务器抱怨您正在尝试设置 Sql 语句中未定义的局部变量的值,从而抛出一条错误消息。

因此您需要在报表设计器的报表参数部分设置报表参数。然后,您的 Sql 可以像这样引用您的参数:

SELECT * FROM MyTable WHERE SomeDate >= @rundate

参数通常会自动映射到您的数据集中,但您可能需要通过进入数据集上的“参数”设置来确认这一点。如果该参数不存在,请进行设置。

经过长时间的反复试验,我发现答案是不要在 SSRS 报表服务器上将参数设置为默认值。