SSRS - 如何在验证错误时停止存储过程执行

时间:2014-06-17 06:09:41

标签: sql validation stored-procedures reporting-services ssrs-2008

我已经实施了SSRS 2008报告,该报告的参数embed_id应该是数字。我还添加了一个验证代码来检查输入的embed_id是否有效(数字)。

存储过程用于获取报告数据。当我在abc文本框中输入embed_id之类的字母时,验证代码会正确返回false,但仍然会执行SP执行,从而在UI上出现以下错误 -

  

数据集'embed'的查询执行失败。列名称'abc'无效。

我添加了一条红色的消息,显示自定义文字,例如“嵌入ID无效”,但在这种情况下不会显示。

有没有办法在验证错误上取消SP执行?或者我应该在SP内部处理它,以便SP在接收到这样的无效输入时返回零行?

2 个答案:

答案 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执行存储过程。所以我已经分两步实现了验证。

  1. 在报告级别添加了自定义验证,用于检查嵌入ID是否真的为数字。如果没有,它将显示错误消息。

  2. 在SP中,之前我曾经得到上述错误,因为我的查询是这样的(以简化的方式):

    从embed_table中选择*,其中embed_id = @embed_id

  3. 当@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。通过此更改,查询不会中断,并且将向用户显示验证消息。