SQL CLR聚合函数错误处理

时间:2013-05-29 19:34:11

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

我有一个用户定义的CLR聚合函数,可能会抛出错误。我想知道如果在我的查询中出现错误,如何处理错误。

该功能正在执行类似于Excel所做的IRR计算,即。迭代根寻找计算。如果未找到根,则会引发错误。这是我需要处理的错误。

查询是较大存储过程的一部分,它看起来像:

select 
MyID, 
Excel_XIRR(col1) 
from @t
group by MyID

我得到的错误是这样的:

A .NET Framework error occurred during execution of user-defined routine or aggregate "Excel_Xirr": 
System.ArgumentException: Not found an interval comprising the root after 60 tries, last tried was (-172638549748481000000000.000000, 280537643341281000000000.000000)
System.ArgumentException: 
   at System.Numeric.Common.rfindBounds@59(FastFunc`2 f, Double minBound, Double maxBound, Double precision, Double low, Double up, Int32 tries)
   at System.Numeric.Common.findBounds(FastFunc`2 f, Double guess, Double minBound, Double maxBound, Double precision)
   at System.Numeric.Common.findRoot(FastFunc`2 f, Double guess)
   at Excel_Xirr.Terminate()

我的问题是并非所有行都会导致此错误。查询中有一些合法的结果我想要捕获并在以后的存储过程中使用。这个错误会阻止我获取查询结果吗?如果是这样,有没有办法找出哪些行抛出错误(动态)然后重新运行其余行的查询?

1 个答案:

答案 0 :(得分:1)

不确定你对XIRR函数本身的编码有多好,在Error消息中查看你的函数原型,看起来你正在使用Bi-section方法找到root,这对于算法最不适合使用找到率。你将自己锁定在一个下限和上限内,无论这个界限有多大,它都不会对所有情况有所帮助

至于解决处理错误的直接问题,您可以更改.net代码并使用返回值Math.Pow(-1,0.5)替换Throw ... Exception语句

这会将NAN返回给调用程序,然后您可以使用IF语句检查以确认您的XIRR值是否为数字(当找到IRR时)或NAN值(当未找到IRR时)