Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 SQL CLR聚合函数错误处理_Sql Server 2005_Error Handling_Aggregate Functions_User Defined Functions_Sqlclr - Fatal编程技术网

Sql server 2005 SQL CLR聚合函数错误处理

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

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

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

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

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


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

这是一个明智的解决方案,因此您可以对此给予肯定。但是SQL Server无法识别NaN,因此该函数必须返回null。我的希望是在不改变函数的情况下处理错误,但我怀疑这是否会起作用。