9

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

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

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

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

是否有任何调用方便的方法来停止SQL Server中的错误函数?

回答

7

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

你真的不能对此做很多事 - 那就是(现在)就是这样。要么你可以定义你的UDF,这样你就可以通过它的返回值(例如在发生错误时返回NULL)来发回错误条件,或者你几乎不得不求助于编写一个存储过程,它可以有更多的错误处理,并允许RAISERROR等等。因此,要么设计你的UDF不要求特定的错误条件信号,要么你必须重新设计你的使用存储过程的方法(它可以有多个OUTPUT参数,因此也可以返回错误代码和你的数据有效载荷,如果你需要的话),或者为你的UDF管理CLR代码。

对不起,我没有更好的主意 - 现在,我担心,这些都是你的选择 - 随你选。

马克

+0

我期待的很多,但我想我会问。谢谢。 – 2009-08-06 19:05:00

+1

sprocs的问题是你不能用函数的方式调用它们。 – 2013-01-08 19:17:18

+0

我同意@MikeK。我使用UDF而不是完整stored_procedure的全部原因是内联使用。 在较新版本的SQL Server中是否更改了此问题的答案? (例如2016) – ColinMac 2017-09-18 21:29:07

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。

+0

我想可以在预期的表格中返回错误文本,是吗? – ColinMac 2017-09-18 21:28:34