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?

Antworten auf die Frage(5)

Ihre Antwort auf die Frage