„Właściwy” sposób sprawdzania poprawności parametrów procedury przechowywanej
Mam procedurę składowaną, która sprawdza niektóre parametry i powinna zakończyć się niepowodzeniem i zatrzymać wykonanie, jeśli parametr jest niepoprawny.
Moje pierwsze podejście do sprawdzania błędów wyglądało tak:
<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>
To nie przyniosło rezultatu, ponieważ stopień ważności 18 nie zatrzymuje wykonania, a „sprawdzanie poprawności” zostało wydrukowane razem z komunikatami o błędach.
Wiem, że mogę po prostu dodać zwrot po każdym raiserror, ale wygląda to trochę brzydko dla mnie:
<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>
Ponieważ błędy o sile 11 i wyższej są wychwytywane w bloku try / catch, innym podejściem, które testowałem, było hermetyzowanie sprawdzania błędów wewnątrz takiego bloku try / catch. Problem polegał na tym, że błąd został połknięty i nie został w ogóle wysłany do klienta. Zrobiłem więc trochę badań i znalazłem sposób na topowtórzyć błąd:
<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>
Nadal nie jestem zadowolony z tego podejścia, dlatego proszę Cię:
Jak wygląda walidacja parametrów? Czy istnieje jakaś „najlepsza praktyka” do tego rodzaju kontroli?