【问题标题】:SQL CLR Aggregate function Error HandlingSQL CLR 聚合函数错误处理
【发布时间】:2013-05-25 05:09:16
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您,因为这似乎是一个明智的解决方案。但 SQL Server 无法识别 NaN,因此该函数必须返回 null。我希望在不更改功能的情况下处理错误,但我怀疑这样做是否有效。
    猜你喜欢
    • 2014-01-27
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2011-07-05
    相关资源
    最近更新 更多