【问题标题】:Error Handling in User Defined Functions用户定义函数中的错误处理
【发布时间】:2010-11-17 10:52:47
【问题描述】:

我想在 SQL Server 2005 中编写一个非 CLR 用户定义函数。该函数接受一个输入字符串并返回一个输出字符串。如果输入字符串无效,那么我想向调用者指示错误。

我的第一个想法是使用 RAISERROR 引发异常。但是,SQL Server 不允许在 UDF 中这样做(尽管您可以在基于 CLR 的 UDF 中引发异常,如图所示)。

如果输入值有误,我最后的办法是从函数中返回 NULL(或其他错误指示​​值)。但是,我不喜欢这个选项,因为它:

  1. 不向调用者提供任何有用的信息
  2. 不允许我返回 NULL 以响应有效输入(因为它被用作错误代码)。

是否有任何调用者友好的方法可以在 SQL Server 中出现错误时停止函数?

【问题讨论】:

    标签: sql-server sql-server-2005 function error-handling user-defined-functions


    【解决方案1】:

    SQL Server UDF 似乎在这种(以及许多其他)方式上有点受限。

    你真的无能为力 - (目前)就是这样。您可以定义您的 UDF,以便您可以通过其返回值(例如,在发生错误时返回 NULL)发出错误条件的信号,或者您几乎不得不求助于编写一个存储过程,它可以有更多的错误处理,并允许 RAISERROR 等等。

    因此,要么将 UDF 设计为不需要特定的错误条件信号,要么必须重新设计使用存储过程的方法(它可以有多个 OUTPUT 参数,因此也可以与数据负载一起返回错误代码,如果您需要),或为您的 UDF 托管 CLR 代码。

    抱歉,我没有更好的主意 - 恐怕现在,这些是你的选择 - 选择吧。

    马克

    【讨论】:

    • 我期望的一样多,但我想我会问。谢谢。
    • sprocs 的问题是你不能像使用函数那样内联调用它们。
    • 我同意@MikeK。我使用 UDF 而不是完整的 stored_procedure 的全部原因是为了内联使用。在较新版本的 SQL Server 中,这个问题的答案是否发生了变化? (例如 2016 年)
    • 我只是觉得这个问题在 8 年后仍在帮助人们真是太棒了。 :) 哦,升级你的 SQL Server,我们现在有 THROW 和 CATCH。
    【解决方案2】:

    基于这个想法,在对重复问题here 的回答中给出了一个可能的解决方案:

    return cast('Error message here.' as int);
    

    这会引发这样的事情:

    Msg 245, Level 16, State 1, Line 1
    Conversion failed when converting the varchar value 'Error message here.' to data type int.
    

    它适用于标量值 UDF,但不适用于表值 UDF。

    【讨论】:

    • 我想可以在预期的表格形式中返回错误文本,是吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-19
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    相关资源
    最近更新 更多