用户定义函数中的错误处理

时间:2009-08-06 18:11:48

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

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

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

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

  1. 不向来电者提供任何有用的信息
  2. 不允许我返回NULL以响应有效输入(因为它被用作错误代码)。
  3. 是否有任何调用者友好的方法来暂停SQL Server中的错误函数?

2 个答案:

答案 0 :(得分:7)

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

你真的无法做很多事情 - 那就是(现在)只是它的方式。要么你可以定义你的UDF,以便你可以通过它的返回值发出错误信号(例如,在出现错误时返回NULL),或者你几乎不得不求助于编写存储过程,这可能有更多错误处理并允许RAISERROR等。

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

抱歉,我没有更好的主意 - 现在,我担心,这些都是你的选择 - 接受你的选择。

马克

答案 1 :(得分:1)

基于这个想法,在回答重复问题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。