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?