【问题标题】:SSRS - how to stop stored procedure execution on validation errorSSRS - 如何在验证错误时停止存储过程执行
【发布时间】:2014-06-17 06:09:41
【问题描述】:

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

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

数据集“嵌入”的查询执行失败。列名“abc”无效。

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

有没有办法在验证错误时取消 SP 执行?还是我应该在 SP 本身内处理它,以便 SP 在接收到此类无效输入时返回零行?

【问题讨论】:

  • 参数数据类型设置为什么?大概是文字?为什么不将其设置为数字并让报告服务进行验证?
  • @MartinSmith - 谢谢!它被设置为文本。我尝试了您的建议并将其设置为整数。但是当我输入字母时,顶部的参数消失了,我在页面上得到的只是这条消息-“为报告参数'embed_id'提供的值对其类型无效。(rsReportParameterTypeMismatch)”-不是真的很漂亮。它也接受负值。所以这对我不起作用。还有另一个有点复杂的验证,它涉及我需要实现的两个日期。考虑到如果有办法停止 SP 的执行,那真的很有帮助。
  • 嗯,AFAIK 没有办法在报告服务本身中连接并进行自定义参数验证,因此您需要在存储过程本身中进行。
  • 虽然在这里可能有用吗? stackoverflow.com/q/606621/73226

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


【解决方案1】:

您的最后一句话是最好的答案 - 不要让您的 SP 因错误而崩溃,而是返回 0 行。

在 SSRS 中,Tablix 等对象具有可自定义的消息,当底层数据集没有返回任何行时,该消息就会显示。

解决此问题的另一种方法是将您的日期参数(或更好的其他参数)基于数据集,并在该数据集的逻辑中验证 embed_id,如下所示:

WHERE (SELECT COUNT(*) FROM embed_table WHERE embed_id = @embed_id ) > 0

有了这个,用户在输入有效的 embed_id 之前不会获得该参数的值列表。

我真的对 SSRS 参数用户界面感到满意 - 它已经 10 多年没有更新了,即使在那时功能也很糟糕。

【讨论】:

  • 如果他们也给属性窗口一点TLC也很好。有些字符串区分大小写而其他字符串不区分大小写,这很烦人。对于某些属性,双击左侧会切换列表,对于其他属性(包括您只想从 true 切换到 false 的布尔值,反之亦然,双击不起作用...)
  • 我将此标记为已接受的答案。最后,除了我在 SSRS 中添加的自定义验证之外,我还必须对我的 SP 进行一些小改动。我提供更改描述作为另一个答案,以防万一可以帮助其他人。谢谢!
【解决方案2】:

最后我得出结论,没有办法停止从 SSRS 执行存储过程。所以我分两步实施了验证。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    • 2023-03-13
    相关资源
    最近更新 更多