«Правильный» способ проверки параметров хранимой процедуры
У меня есть хранимая процедура, которая выполняет проверку некоторых параметров и должна завершиться с ошибкой и остановить выполнение, если параметр недопустим.
Мой первый подход к проверке ошибок выглядел так:
<code>create proc spBaz ( @fooInt int = 0, @fooString varchar(10) = null, @barInt int = 0, @barString varchar(10) = null ) as begin if (@fooInt = 0 and (@fooString is null or @fooString = '')) raiserror('invalid parameter: foo', 18, 0) if (@barInt = 0 and (@barString is null or @barString = '')) raiserror('invalid parameter: bar', 18, 0) print 'validation succeeded' -- do some work end </code>
Это не помогло, поскольку уровень серьезности 18 не останавливает выполнение и «проверка прошла успешно». печатается вместе с сообщениями об ошибках.
Я знаю, что могу просто добавить возврат после каждого raiserror, но для меня это выглядит довольно уродливо:
<code> if (@fooInt = 0 and (@fooString is null or @fooString = '')) begin raiserror('invalid parameter: foo', 18, 0) return end ... print 'validation succeeded' -- do some work </code>
Так как ошибки со степенью серьезности 11 и выше обнаруживаются в блоке try / catch, другой протестированный мною подход заключался в инкапсуляции моей проверки ошибок в такой блок try / catch. Проблема заключалась в том, что ошибка была проглочена и не отправлена клиенту вообще. Поэтому я провел небольшое исследование и нашел способRethrow Ошибка:
<code> begin try if (@fooInt = 0 and (@fooString is null or @fooString = '')) raiserror('invalid parameter: foo', 18, 0) ... end try begin catch exec usp_RethrowError return end catch print 'validation succeeded' -- do some work </code>
Я все еще не доволен этим подходом, поэтому я прошу вас:
Как выглядит проверка параметров? Есть ли какая-то «лучшая практика»? сделать этот вид проверки?