0

我有一個用戶定義的CLR聚合函數,可能會引發錯誤。我想知道如何處理一個錯誤,如果我的查詢發生。SQL CLR聚合函數錯誤處理

該函數執行的IRR計算與Excel所做的相似,即,一個迭代的根發現計算。如果找不到root,則會引發錯誤。這是我需要處理的錯誤。

查詢是一個更大的存儲過程的一部分,它看起來像:

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 [email protected](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() 

我的問題是,並非所有的行導致此錯誤。查詢中有一些合法的結果,我希望在我的存儲過程中捕獲並稍後使用。這個錯誤會阻止我獲取查詢的結果嗎?如果是這樣,是否有辦法找出哪些行將引發錯誤(動態),然後重新運行查詢以查找其餘行?

回答

1

不知道你已經對XIRR函數本身進行了編碼,在錯誤消息中查看你的函數原型,看起來你正在使用一個雙節找到根的方法,這對於算法來說並不是最合適的。找到率。你將自己鎖定在一個上限和下限內,不管這個界限有多大,它不會對所有情況都有幫助

至於解決你處理錯誤的直接問題,你可以改變你的.net代碼和用返回值Math.Pow替換Throw ... Exception語句(-1,0.5)

這將返回一個NAN到調用程序,然後您可以使用IF語句來檢查以確認您的XIRR值是一個數字(當發現IRR時)或一個NAN值(當沒有找到IRR時)

+0

因爲它看起來像是一個明智的解決方案,因此給予您信任。儘管SQL Server不能識別NaN,所以函數將不得不返回null。我的希望是在不改變功能的情況下處理錯誤,但是我懷疑這是在做什麼。 – FistOfFury