К сожалению функции в MS SQL так и остаются неполноценными и одна из проблем, это генерация ошибки из функции.
Для демонстрации создадим простейшую функцию складывающую положительные int
Ну в общем все хорошо, но сообщить о том, что нам подали отрицательное значение сложно, а именно при попытки добавить RAISEERROR или THROW мы получим ошибку этапа компиляции. Для RAISEERROR это будет следующее сообщение
Для того, чтобы хоть как-то исправить это положение есть два пути
Метод 1 RETURN CAST
Простейший метод, позволяющий сформировать ошибку в функции
Базируется на том, что CAST VARCHAR->INT сгенерит ошибку. Правда текст ошибки не очень удачен
Метод 2 Процедура + OPENQUERY
Метод чуть более изощренный, но работает (говорим спасибо Yan Roginevich)
Для начала нам нужен loopback связанный сервер
Процедура, формирующая ошибку
И теперь наша функция будет выглядеть следующим образом
При таком исполнении, все выглядит гораздо лучше. Мы даже можем управлять error severity и state
Ну теперь о скорости, если скорость сильна важна, то наш выбор RETURN CAST, если нет и хочется формировать нормальное сообщение о ошибке, то выбираем второй метод.
Для демонстрации создадим простейшую функцию складывающую положительные int
Ну в общем все хорошо, но сообщить о том, что нам подали отрицательное значение сложно, а именно при попытки добавить RAISEERROR или THROW мы получим ошибку этапа компиляции. Для RAISEERROR это будет следующее сообщение
Для того, чтобы хоть как-то исправить это положение есть два пути
Метод 1 RETURN CAST
Простейший метод, позволяющий сформировать ошибку в функции
Базируется на том, что CAST VARCHAR->INT сгенерит ошибку. Правда текст ошибки не очень удачен
Метод 2 Процедура + OPENQUERY
Метод чуть более изощренный, но работает (говорим спасибо Yan Roginevich)
Для начала нам нужен loopback связанный сервер
Процедура, формирующая ошибку
И теперь наша функция будет выглядеть следующим образом
При таком исполнении, все выглядит гораздо лучше. Мы даже можем управлять error severity и state
Ну теперь о скорости, если скорость сильна важна, то наш выбор RETURN CAST, если нет и хочется формировать нормальное сообщение о ошибке, то выбираем второй метод.
Комментариев нет :
Отправить комментарий