0

У меня есть определенная пользователем функция агрегации CLR, которая может потенциально вызвать ошибку. Я хотел бы знать, как обрабатывать ошибку, если она встречается в моем запросе.Функция агрегирования SQL CLR Обработка ошибок

Функция выполняет расчет IRR, аналогичный тому, который делает Excel, т.е. итеративный расчет корневого поиска. Если корень не найден, возникает ошибка. Это ошибка, которую мне нужно обработать.

Запрос является частью большего размера хранимой процедуры, и это выглядит примерно так:

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, глядя на ваши прототипы функций в сообщениях об ошибках, кажется, вы используете метод Bi-section для поиска корней, который не подходит для использования в алгоритмах, когда он приходит к поиску ставок. Вы будете блокировать себя в нижней и верхней границах независимо от того, насколько велика эта граница, это не поможет для всех случаев.

Что касается решения вашей непосредственной проблемы с обработкой ошибки, вы можете изменить свой код .net и замените оператор Throw ... Exception с возвращаемым значением Math.Pow (-1, 0.5)

Это вернет NAN вызывающей программе, которую вы можете проверить с помощью оператора IF, чтобы подтвердить, соответствует ли значение XIRR является числом (при обнаружении IRR) или значением NAN (когда IRR не найден)

+0

дает вам кредит на это, так как это кажется разумным решением. SQL Server не распознает NaN, хотя функция должна вернуть null. Я надеялся обработать ошибку без изменения функции, но я сомневаюсь, что она работает. – FistOfFury

 Смежные вопросы

  • Нет связанных вопросов^_^