0

我有一个用户定义的 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()

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

4

1 回答 1

1

不确定您对 XIRR 函数本身的编码有多好,在错误消息中查看您的函数原型,您似乎正在使用二分法来查找根,这在查找速率时不适合使用的算法。无论这个界限有多大,你都会将自己锁定在一个上下限内,它不会对所有情况都有帮助

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

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

于 2013-05-31T13:58:19.737 回答