Sql server 2005 SQL CLR聚合函数错误处理
我有一个用户定义的CLR聚合函数,它可能引发错误。我想知道如果查询中出现错误,如何处理 该函数正在执行与Excel类似的IRR计算,即迭代寻根计算。如果找不到根,则抛出错误。这是我需要处理的错误 查询是较大存储过程的一部分,它看起来类似于:Sql server 2005 SQL CLR聚合函数错误处理,sql-server-2005,error-handling,aggregate-functions,user-defined-functions,sqlclr,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-defi
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()
我的问题是不是所有的行都会导致此错误。查询中有一些合法的结果,我希望稍后在存储过程中捕获并使用这些结果。这个错误会阻止我获取查询结果吗?如果是这样,有没有办法找出哪些行(动态地)抛出错误,然后重新运行其余行的查询 不确定您对XIRR函数本身的编码有多好,查看错误消息中的函数原型,您似乎使用的是一种查找根的双段方法,在查找速率时,这种方法不适合使用算法。无论这个界限有多大,你都会将自己锁定在一个下限和上限之内,这对所有情况都没有帮助 至于解决处理错误的直接问题,您可以更改.net代码,并用返回值Math.Pow(-1,0.5)替换Throw…Exception语句
这将向调用程序返回一个NAN,然后您可以使用IF语句检查该NAN,以确认您的XIRR值是一个数字(当找到IRR时)还是一个NAN值(当找不到IRR时)这是一个明智的解决方案,因此您可以对此给予肯定。但是SQL Server无法识别NaN,因此该函数必须返回null。我的希望是在不改变函数的情况下处理错误,但我怀疑这是否会起作用。