A maneira "certa" de fazer a validação de parâmetros de procedimento armazenado
Eu tenho um procedimento armazenado que faz alguma validação de parâmetro e deve falhar e parar a execução se o parâmetro não é válido.
Minha primeira abordagem para verificação de erros se pareceu com isto:
<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>
Isso não funcionou, pois a gravidade 18 não interrompe a execução e a 'validação bem-sucedida' é impressa junto com as mensagens de erro.
Eu sei que eu poderia simplesmente adicionar um retorno após cada raiserror, mas isso parece meio feio para mim:
<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>
Como os erros com gravidade 11 e superior são capturados em um bloco try / catch, outra abordagem que testei foi encapsular minha verificação de erros dentro desse bloco try / catch. O problema é que o erro foi engolido e não foi enviado ao cliente. Então eu fiz algumas pesquisas e encontrei uma maneira deretroceder o erro:
<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>
Eu ainda não estou feliz com essa abordagem, então estou perguntando a você:
Como é a validação do seu parâmetro? Existe algum tipo de "melhor prática" para fazer este tipo de verificação?