La forma "correcta" de hacer la validación de parámetros de procedimientos almacenados

Tengo un procedimiento almacenado que hace una validación de algunos parámetros y debería fallar y detener la ejecución si el parámetro no es válido.

Mi primer enfoque para la comprobación de errores se veía así:

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

Esto no funcionó porque la gravedad 18 no detiene la ejecución y se imprime 'validación exitosa' junto con los mensajes de error.

Sé que simplemente podría agregar una devolución después de cada raiserror pero esto me parece algo feo:

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

Dado que los errores con gravedad 11 y superior se detectan dentro de un bloque try / catch, otro enfoque que probé fue para encapsular mi comprobación de errores dentro de dicho bloque try / catch. El problema fue que el error se tragó y no se envió al cliente en absoluto. Así que hice una investigación y encontré una manera derehacer el error:

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

Todavía no estoy contento con este enfoque, así que te pregunto:

¿Cómo se ve tu validación de parámetros? ¿Hay algún tipo de "mejor práctica" para hacer este tipo de verificación?

Respuestas a la pregunta(5)

Su respuesta a la pregunta