SSRS 2017:想要在共享数据集中将参数设置为默认值 NULL

SSRS 2017: Want to set a parameter to a default of NULL in a shared dateaset

问题

我的 SSRS 2017 共享数据集有问题。

此数据集正在调用存储过程。 SP 的参数之一是 DateTime 类型。在数据集的参数对话框中,我将默认设置为 (Null)。但这似乎被忽略了...

使用分页报告一切正常。定义的报表参数(或内置参数)可用于传递有效值。

但是当我尝试在移动报表中使用此数据集时出现错误。我什至无法添加数据集!经过相当多的搜索后,我发现 SP 是用空白而不是 NULL 调用的(Pofiler 告诉我 ,@ClientTime=N''),因此类型转换为 DateTime失败。

我不想把这个参数改成字符串类型,因为这个报表在各种环境下都会运行。如果作为字符串进入存储过程的正确日期真的很糟糕:Nov 14 2017 3:35PM(文化和语言相关!)我不想依赖从字符串的任何转换!

问题

如何强制 SSRS 共享数据集使用真实的 NULL 作为参数?

您是否在 SharePoint 中托管此数据集?如果是这样,您确定默认值实际上是在 SharePoint 保存的版本上设置的吗?我一直观察到,虽然您可以在报表设计器中将值设置为 null,但当它保存到 SharePoint 时,null 默认值会丢失。只需从 SharePoint 界面编辑数据集参数,并在保存后为适当的参数设置 select Null。尽管我很长时间没有分析参数,但我经常在我的 SQL 中进行“@param IS NULL”测试并且从未遇到过问题。

请注意,您以后不必每次编辑 dataset/report 时都执行此操作,只需在初始保存时执行即可。

好吧,我找到了解决方案...不是真正解决问题的方法,但它似乎可以帮助我:

DECLARE @blank VARCHAR(1)='';
SELECT CAST(@blank AS DATETIME) AS toDateTime
      ,CAST(@blank AS DATETIME2) AS toDateTime2
      ,CAST(@blank AS TIME) AS toTime
      ,CAST(@blank AS DATE) AS toDate
      ,CAST(@blank AS BIT) AS toBit
      ,CAST(@blank AS INT) AS toInt
      ,CAST(@blank AS FLOAT) AS toFloat

结果

toDateTime          toDateTime2         toTime      toDate      toBit toInt toFloat
1900-01-01 00:00:00 1900-01-01 00:00:00 00:00:00    1900-01-01  0     0     0

将数据集添加到移动报告时出错的原因并非来自空白字符串的 DATETIME 转换,而是来自我的 T-SQL-代码中更深的地方,我在那里计算一个时间差,没想到是1900-01-01的值。错误信息很大,半个屏幕都被文字覆盖了,但是没有真正提示原因...

但这会引发错误,因此我将避免数据类型不是从空白本地转换的:

SELECT CAST(@blank AS decimal(10,4)) AS toDecimal 

Msg 8114, Level 16, State 5, Line 10
Error converting data type varchar to numeric.

这意味着:我必须将值 1900-01-01 取为 NULL。仍然很愚蠢,SSRS 允许默认值为 NULL 的参数,但在后台发送空白。

如果有其他解决方案可以实现真正的 NULL 我仍然很乐意阅读它们!

更新:有趣的事实

探查器告诉我,分页报告将参数集作为空白传递给 (Null)(如问题中所示)。但是对于移动报告,(Null) 被传递为 ,@DateTimeFrom=N'Nothing'。默认值必须设置为空值,即为空白...