«Правильный» способ проверки параметров хранимой процедуры

У меня есть хранимая процедура, которая выполняет проверку некоторых параметров и должна завершиться с ошибкой и остановить выполнение, если параметр недопустим.

Мой первый подход к проверке ошибок выглядел так:

<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>

Я все еще не доволен этим подходом, поэтому я прошу вас:

Как выглядит проверка параметров? Есть ли какая-то «лучшая практика»? сделать этот вид проверки?

Ответы на вопрос(5)

Ваш ответ на вопрос