Tengo un procedimiento almacenado que realiza la validación de algunos parámetros y debe fallar y detener la ejecución si el parámetro no es válido.La forma "correcta" de hacer la validación del parámetro de procedimiento almacenado
Mi primer acercamiento para verificación de errores se veía así:
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
Esto no hizo el truco ya que la gravedad 18 no se detiene la ejecución y 'validación tuvo éxito' se imprime junto con los mensajes de error.
Sé que simplemente podría añadir un retorno después de cada raiserror pero esto parece un poco feo para mí:
if (@fooInt = 0 and (@fooString is null or @fooString = ''))
begin
raiserror('invalid parameter: foo', 18, 0)
return
end
...
print 'validation succeeded'
-- do some work
Dado que los errores con gravedad 11 y superiores se encuentran atrapados dentro de un bloque try/catch otro enfoque Probé fue para encapsular mi error comprobando dentro de tal bloque try/catch. El problema fue que el error se tragó y no se envió al cliente en absoluto. Así que hice algunas investigaciones y encontró una manera de rethrow el error:
Todavía no estoy feliz con este enfoque por lo que te pido:
¿Cómo su validación de parámetros parecen? ¿Hay algún tipo de "mejor práctica" para hacer este tipo de control?
¿Hay alguna razón por la que haya utilizado IF (ISNULL (@fooString, '') = '') en lugar de IF (@fooString es nulo)? – macleojw
@macleojw: Comprueba nulo y "al mismo tiempo ... inteligente :) – VVS
El segundo validador tiene una sintaxis no válida: 'RAISEERROR'. Debe haber solo una 'e'. Es curioso que en inglés sea correcto ya que 'raise + error' tiene doble 'e' pero no en lenguaje MS SQL. –