Pracuję nad skryptem SQL i wymagam, aby przestać kontynuować skrypt, jeśli niektóre warunki nie zostaną spełnione.
Po przejściu do Google znalazłem, że RaisError z poziomem 20 dotkliwości go zakończy. Ale z niektórych powodów nie mogę skorzystać z tej opcji.
Czy mogę podać, jakie są możliwe alternatywy, aby zatrzymać wykonywanie skryptu SQL.
sql-server
sql-server-2005
error-handling
Nowy programista
źródło
źródło
Odpowiedzi:
Z dokumentacji RAISERROR ( wyróżnienie moje):
Jest wysoce prawdopodobne, że zleceniodawca wykonuje skrypt, ponieważ nie spełnia tych kryteriów.
Nie ma nic złego w korzystaniu
RAISERROR
; po prostu używasz nadmiernego poziomu istotności. Używam poziomu 16 jako domyślnego dla zgłaszanego błędu i sekwencja zostanie zakończona. Jeśli chcesz być bardziej dokładny, możesz śledzić poziomy podane przez sam Microsoft:Powiedziawszy to wszystko, w zależności od kontekstu skryptu, użycie
RAISERROR
może nie wystarczyć, ponieważ samo nie „wychodzi” ze skryptu (przy użyciu normalnych poziomów ważności).Na przykład:
Będzie to zarówno podnieść błąd i zwraca zestaw wyników.
Aby natychmiast zakończyć skrypt, wolę go używać
RETURN
(używanieGOTO
konstrukcji typu -type jest ogólnie odradzane w większości kręgów programistycznych, w których istnieją alternatywy):Lub obsłużyć błąd przy użyciu
TRY/CATCH
, co spowoduje przeskakiwanie wykonania doCATCH
bloku, jeśli wskaźnik ważności wynosi 11 lub więcej:Osobny problem polega na tym, że skrypt obejmuje wiele partii - zamknie
RETURN
tylko partię :Aby to naprawić, możesz sprawdzić
@@ERROR
na początku każdej partii:Edycja: Jak słusznie zauważył Martin Smith w komentarzach, działa to tylko dla 2 partii. Aby rozszerzyć do 3 lub więcej partii, możesz kaskadowo zgłaszać błędy w ten sposób (uwaga:
GOTO
metoda nie rozwiązuje tego problemu, ponieważ etykieta docelowa musi być zdefiniowana w partii):Lub, jak wskazuje również, możesz użyć tej
SQLCMD
metody, jeśli jest to odpowiednie dla twojego środowiska.źródło
Możesz użyć tego
GOTO
oświadczenia, aby przejść gdziekolwiek chcesz. Innymi słowy, napotkasz błąd lub jakiś inny warunek i możesz mieć etykietę na dole skryptu (tj.TheEndOfTheScript:
) I po prostu wydaćgoto TheEndOfTheScript;
instrukcję.Oto krótka próbka:
Dane wyjściowe tego wykonania będą następujące:
Jak widać,
GOTO
pominął drukowanie trzeciej i czwartej instrukcji i skoczył w prawo do label (TheEndOfTheScript
).źródło
Najlepszym sposobem jest użycie SET NOEXEC ON
Możesz przeczytać więcej tutaj: Jak ZATRZYMAĆ, PRZERWAĆ lub PRZERWAĆ wykonanie instrukcji w bieżącej partii oraz w kolejnych partiach oddzielonych instrukcją GO na podstawie niektórych warunków w SERWERZE SQL
źródło
Zgadzam się z
SET NOEXEC ON/OFF
, jednak w przechowywanych procesach (zawierających pojedynczy blok) po prostu używamRETURN
instrukcji.Ostrzeżenia: W pliku skryptu, jeśli masz wiele
GO
instrukcji,RETURN
wyjdą one tylko z bieżącego bloku i przejdą do następnego bloku / partii.Uwaga:
GOTO
ma to być zła praktyka kodowania,TRY..CATCH
zalecane jest użycie „ ”, ponieważ zostało wprowadzone od SQL Server 2008, a następnieTHROW
w 2012 roku.źródło