Mam procedurę składowaną, która dokonuje weryfikacji niektórych parametrów i powinna zakończyć się niepowodzeniem i zakończyć wykonywanie, jeśli parametr jest niepoprawny."Prawidłowy" sposób sprawdzania poprawności procedury przechowywanej
Moje pierwsze podejście do sprawdzania błędów wyglądał następująco:
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
To nie załatwi od nasilenia 18 nie zatrzymuje wykonanie i „walidacji udało” jest drukowany wraz z komunikatami o błędach.
wiem, może po prostu dodać powrót po każdym RAISERROR ale wygląda to rodzaj brzydki do mnie:
if (@fooInt = 0 and (@fooString is null or @fooString = ''))
begin
raiserror('invalid parameter: foo', 18, 0)
return
end
...
print 'validation succeeded'
-- do some work
Od błędów z powagi 11 i wyższe są wychwytywane wewnątrz bloku try/catch innego podejścia Testowałem było zamknięcie mojego sprawdzania błędów w takim bloku try/catch. Problem polegał na tym, że błąd został połknięty i w ogóle nie wysłany do klienta. Więc zrobiłem kilka badań i znaleźć sposób, aby rethrow błąd:
ja nadal nie jestem zadowolony z tego podejścia, więc pytam Cię:
jaki sposób Państwa walidacja parametrów wyglądają? Czy istnieje jakaś "najlepsza praktyka" do tego rodzaju sprawdzania?
Czy istnieje jakiś powód, dla którego użyłeś IF (ISNULL (@fooString, '') = '') zamiast IF (@fooString ma wartość null)? – macleojw
@macleojw: Sprawdza null i "'w tym samym czasie .. sprytny :) – VVS
Drugi weryfikator ma nieprawidłową składnię:" RAISEERROR ". Powinno być tylko jedno "e". Zabawne jest to, że po angielsku jest to poprawne, ponieważ "podniesienie + błąd" ma podwójne "e", ale nie w języku MS SQL. –