Die „richtige“ Methode zur Validierung von Parametern für gespeicherte Prozeduren
Ich habe eine gespeicherte Prozedur, die eine Parameterüberprüfung durchführt und die Ausführung fehlschlagen und stoppen sollte, wenn der Parameter nicht gültig ist.
Mein erster Ansatz zur Fehlerprüfung sah folgendermaßen aus:
<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>
Dies hat nicht geholfen, da der Schweregrad 18 die Ausführung nicht stoppt und die Meldung "Validierung erfolgreich" zusammen mit den Fehlermeldungen ausgegeben wird.
Ich weiß, ich könnte einfach nach jedem Raise eine Rendite hinzufügen, aber das sieht für mich irgendwie hässlich aus:
<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>
Da Fehler mit Schweregrad 11 und höher in einem Try / Catch-Block abgefangen werden, bestand ein anderer von mir getesteter Ansatz darin, meine Fehlerprüfung in einem solchen Try / Catch-Block zu kapseln. Das Problem war, dass der Fehler verschluckt und überhaupt nicht an den Client gesendet wurde. Also habe ich ein bisschen recherchiert und einen Weg gefundenerneut werfen der Fehler:
<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>
Ich bin immer noch nicht zufrieden mit diesem Ansatz, also frage ich Sie:
Wie sieht Ihre Parametervalidierung aus? Gibt es eine Art "Best Practice" für diese Art der Überprüfung?