9

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

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

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

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

是否有任何调用者友好的方式来停止 SQL Server 中的错误函数?

4

2 回答 2

8

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

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

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

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

马克

于 2009-08-06T18:32:25.693 回答
1

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

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。

于 2013-09-12T10:38:17.097 回答