在SSRS中,“预览”上的“日期时间”参数与已部署的报告不匹配

时间:2019-02-10 14:49:25

标签: reporting-services ssrs-2008 rdl

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

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

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

那么,为什么它在本地运行而不在服务器上运行? “ ThirdDataset”是我在此处输入的错误名称。实际名称已编辑。但是,我注意到,如果按字母顺序运行,这将是第一个运行的数据集。所以这引出了一个问题:为什么报表不能将其识别为参数,为什么会抱怨没有声明?

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

更新:

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

选择将运行日期转换为日期(DATEADD(DAY,-2,SYSDATETIME()))

enter image description here

哪天是两天前。由于今天是2/11/2019,因此传递到服务器上SSRS报表的rundate参数应该为2/9/2019。

出于娱乐目的,为了进行测试,我将“默认值”运行日期参数设置为8/8/2018,希望数据驱动的报表可以正确设置它。

enter image description here

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

接下来,让我们看看通过电子邮件发送的订阅警报的内容。它的日期是2/11/2019 12:00:00 AM。如果数据驱动订阅的运行方式应如期运行,则其日期应为2/9/2019,

选择将运行日期转换为日期(DATEADD(DAY,-2,SYSDATETIME()))

为什么这不起作用?

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

enter image description here

作为测试,我将默认的日期/时间参数设置为12:12:34,以了解会发生什么。它重申,是的,这是发送到报告的日期时间戳。因此,我未选中“具有默认值”框 enter image description here

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

enter image description here

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

2 个答案:

答案 0 :(得分:1)

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

因此,看起来像是首次部署报告时,@rundate的默认值为2/7/2019,但此后在本地报告上将其更改为2/10/2019。进入报表服务器,找到报表,然后进入“报表参数”部分以编辑参数,并将默认值更改为所需的值(从报表服务器删除报表,然后使用更新后的参数重新部署它会具有相同的效果,但请注意,该参数将保持向前的默认值)。或者,使用表达式设置报告参数,使其连续更新。

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

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

SELECT * FROM MyTable WHERE SomeDate >= @rundate

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

答案 1 :(得分:0)

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