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

标签 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()

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

最佳答案

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

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

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

关于sql-server-2005 - SQL CLR 聚合函数错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16822382/

相关文章:

sql - 如何找到整数序列中的第一个中断点?

xml - 将 varbinary(max) 转换为 xml 格式

sql - MSSQL 2005 查询组日期 - 甚至没有记录的日期?

sql - SQL Server批处理错误处理问题

android - Retrofit 2 + Rxjava处理错误

sql-server - SQL Server,总是四舍五入

asp.net - 对所有 ASP.NET MVC 错误使用全局(哑)错误页面?

mysql - 当给定的列字符串完全匹配时,如何将值增加到新表?

sql - 通过 PostgreSQL 数据库聚合大型(十亿行)数据集

r - 使用 count()、aggregate()、data.table() 或 dplyr() 汇总数据(均值、标准差)