J'ai une procédure stockée qui effectue une validation de paramètre et devrait échouer et arrêter l'exécution si le paramètre n'est pas valide.La "bonne" façon de faire la validation des paramètres de procédure stockée
Ma première approche pour la vérification d'erreurs ressemblait à ceci:
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
Cela ne fait pas le tour puisque la sévérité 18 ne se limite pas à l'exécution et « validation réussi » est imprimé en même temps que les messages d'erreur.
Je sais que je pourrais simplement ajouter un retour après chaque raiserror mais ressemble un peu laid pour moi:
if (@fooInt = 0 and (@fooString is null or @fooString = ''))
begin
raiserror('invalid parameter: foo', 18, 0)
return
end
...
print 'validation succeeded'
-- do some work
Depuis des erreurs avec sévérité 11 et plus sont pris dans un bloc try/catch Une autre approche je l'ai testé était d'encapsuler ma vérification d'erreur à l'intérieur d'un tel bloc try/catch. Le problème était que l'erreur avait été avalée et n'avait pas été envoyée au client. J'ai donc fait quelques recherches et trouvé un moyen de rethrow l'erreur:
Je ne suis toujours pas satisfait de cette approche donc je vous demande:
Comment votre validation des paramètres ressemble? Y at-il une sorte de «meilleure pratique» pour faire ce genre de vérification?
Y a-t-il une raison pour laquelle vous avez utilisé IF (ISNULL (@fooString, '') = '') plutôt que IF (@fooString est null)? – macleojw
@macleojw: Il vérifie null et '' à la fois .. intelligent :) – VVS
Le second validateur a une syntaxe invalide: 'RAISEERROR'. Il devrait y avoir juste un 'e'. Ce qui est amusant, c'est qu'en anglais c'est correct car 'raise + error' a double 'e' mais pas en langage MS SQL. –