我已经实施了SSRS 2008报告,该报告的参数embed_id
应该是数字。我还添加了一个验证代码来检查输入的embed_id
是否有效(数字)。
存储过程用于获取报告数据。当我在abc
文本框中输入embed_id
之类的字母时,验证代码会正确返回false,但仍然会执行SP执行,从而在UI上出现以下错误 -
数据集'embed'的查询执行失败。列名称'abc'无效。
我添加了一条红色的消息,显示自定义文字,例如“嵌入ID无效”,但在这种情况下不会显示。
有没有办法在验证错误上取消SP执行?或者我应该在SP内部处理它,以便SP在接收到这样的无效输入时返回零行?
答案 0 :(得分:2)
你的最后一句话是最好的答案 - 而不是因为错误导致你的SP崩溃,返回0行。
在SSRS中,诸如Tablix之类的对象具有可自定义的消息,当基础数据集没有返回任何行时会显示该消息。
解决此问题的另一种方法是在数据集上建立Date参数(或更好的其他参数),并在以下行中验证该数据集逻辑中的embed_id:
WHERE (SELECT COUNT(*) FROM embed_table WHERE embed_id = @embed_id ) > 0
有了这个,用户在输入有效的embed_id之前不会得到该参数的值列表。
我真的超过了SSRS参数用户界面 - 它已经超过10年没有更新了,即使这样功能也很糟糕。
答案 1 :(得分:0)
最后我得出结论,无法停止从SSRS执行存储过程。所以我已经分两步实现了验证。
在报告级别添加了自定义验证,用于检查嵌入ID是否真的为数字。如果没有,它将显示错误消息。
在SP中,之前我曾经得到上述错误,因为我的查询是这样的(以简化的方式):
从embed_table中选择*,其中embed_id = @embed_id
当@embed_id不是数字时,比如abc,则使用的查询构造为
select * from embed_table where embed_id = abc
会抛出上述错误,并且由于上面#1中的哪条消息不会显示。所以我更改了查询以进行字符串比较。
select * from embed_table where cast(embed_id as varchar) = cast(@embed_id as varchar)
这将在数字embed_ids上返回正确的结果,并且不会在非数字embed_ids上返回任何内容,因为我们在表中没有这样的id。通过此更改,查询不会中断,并且将向用户显示验证消息。