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'
。默认值必须设置为空值,即为空白...
问题
我的 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'
。默认值必须设置为空值,即为空白...