RAISERROR Sposób
raiserror('Oh no a fatal error', 20, -1) with log
Spowoduje to zakończenie połączenia, a tym samym zatrzymanie pozostałej części skryptu.
Należy pamiętać, że zarówno poziom ważności 20 lub wyższy, jak i WITH LOG
opcja są konieczne, aby działał w ten sposób.
Działa to nawet z instrukcjami GO, np.
print 'hi'
go
raiserror('Oh no a fatal error', 20, -1) with log
go
print 'ho'
Otrzymasz wynik:
hi
Msg 2745, Level 16, State 2, Line 1
Process ID 51 has raised user error 50000, severity 20. SQL Server is terminating this process.
Msg 50000, Level 20, State 1, Line 1
Oh no a fatal error
Msg 0, Level 20, State 0, Line 0
A severe error occurred on the current command. The results, if any, should be discarded.
Zauważ, że napis „ho” nie jest drukowany.
UWAGI:
- Działa to tylko wtedy, gdy jesteś zalogowany jako administrator (rola „sysadmin”) i nie pozostawia Cię bez połączenia z bazą danych.
- Jeśli NIE jesteś zalogowany jako administrator, samo wywołanie RAISEERROR () zakończy się niepowodzeniem i skrypt będzie kontynuował działanie .
- W przypadku wywołania za pomocą narzędzia sqlcmd.exe zostanie zgłoszony kod wyjścia 2745.
Odniesienie: http://www.mydatabasesupport.com/forums/ms-sqlserver/174037-sql-server-2000-abort-whole-script.html#post761334
Metoda noexec
Inną metodą, która działa z instrukcjami GO, jest set noexec on
. Powoduje to pominięcie reszty skryptu. Nie powoduje to zakończenia połączenia, ale należy je noexec
ponownie wyłączyć przed wykonaniem jakichkolwiek poleceń.
Przykład:
print 'hi'
go
print 'Fatal error, script will not continue!'
set noexec on
print 'ho'
go
-- last line of the script
set noexec off -- Turn execution back on; only needed in SSMS, so as to be able
-- to run this script again in the same session.
Wystarczy użyć POWROTU (będzie działał zarówno wewnątrz, jak i poza procedurą przechowywaną).
źródło
Jeśli możesz użyć trybu SQLCMD, to inkantacja
(W TYM dwukropek) spowoduje, że RAISERROR faktycznie zatrzyma skrypt. Na przykład,
wyświetli:
i partia się zatrzyma. Jeśli tryb SQLCMD nie jest włączony, pojawi się błąd analizowania dwukropka. Niestety, nie jest to całkowicie kuloodporne, tak jakby skrypt był uruchamiany bez pracy w trybie SQLCMD, SQL Managment Studio unosi się tuż obok błędów analizy czasu! Mimo to, jeśli uruchamiasz je z wiersza poleceń, jest w porządku.
źródło
Nie użyłbym RAISERROR-SQL ma instrukcje JEŻELI, które mogą być użyte do tego celu. Dokonaj walidacji i przeglądów oraz ustaw zmienne lokalne, a następnie użyj wartości zmiennych w instrukcjach IF, aby warunkować wstawki.
Nie trzeba sprawdzać zmiennego wyniku każdego testu walidacyjnego. Zwykle można to zrobić za pomocą tylko jednej zmiennej flagi, aby potwierdzić spełnienie wszystkich warunków:
Nawet jeśli sprawdzanie poprawności jest bardziej złożone, potrzebujesz tylko kilku zmiennych flag, aby uwzględnić je w końcowej kontroli.
źródło
RAISERROR
, zwłaszcza jeśli nie wiesz, kto będzie uruchamiał skrypty i jakie uprawnienia.declare @i int = 0; if @i=0 begin select '1st stmt in IF block' go end else begin select 'ELSE here' end go
W SQL 2012+ możesz użyć THROW .
Z MSDN:
źródło
Z powodzeniem rozszerzyłem rozwiązanie włączania / wyłączania noexec o transakcję, aby uruchomić skrypt w sposób „wszystko albo nic”.
Najwyraźniej kompilator „rozumie” zmienną @finished w IF, nawet jeśli wystąpił błąd i wykonanie zostało wyłączone. Jednak wartość jest ustawiona na 1 tylko wtedy, gdy wykonanie nie zostało wyłączone. Dlatego mogę odpowiednio zatwierdzić lub wycofać transakcję.
źródło
IF (XACT_STATE()) <> 1 BEGIN Set NOCOUNT OFF ;THROW 525600, 'Rolling back transaction.', 1 ROLLBACK TRANSACTION; set noexec on END;
Ale wykonanie nigdy się nie zatrzymało i skończyło się na trzech błędach „wycofywania transakcji”. Jakieś pomysły?możesz zawinąć instrukcję SQL w pętlę WHILE i użyć BREAK, jeśli to konieczne
źródło
DECLARE @ST INT; SET @ST = 1; WHILE @ST = 1; BEGIN; SET @ST = 0; ...; END
Bardziej gadatliwy, ale do cholery, to i tak TSQL ;-)Możesz zmienić przebieg wykonywania za pomocą instrukcji GOTO :
źródło
Dalsze udoskonalenie metody Sglasses, powyższe linie wymuszają użycie trybu SQLCMD i albo skończą scirpt, jeśli nie używają trybu SQLCMD, albo wykorzystują
:on error exit
wyjście z dowolnego błędu.CONTEXT_INFO służy do śledzenia stanu.
źródło
Czy to jest procedura składowana? Jeśli tak, myślę, że możesz po prostu wykonać Zwrot, na przykład „Zwróć NULL”;
źródło
Sugerowałbym zawinięcie odpowiedniego bloku kodu w blok try catch. Następnie możesz użyć zdarzenia Raiserror o sile 11, aby przełamać blok catch, jeśli chcesz. Jeśli chcesz tylko podnieść błędy, ale kontynuować wykonywanie w bloku try, użyj niższego poziomu ważności.
Ma sens?
Na zdrowie, John
[Edytowane w celu uwzględnienia BOL Reference]
http://msdn.microsoft.com/en-us/library/ms175976(SQL.90).aspx
źródło
możesz użyć RAISERROR .
źródło
Żadne z tych nie działa z instrukcjami „GO”. W tym kodzie, niezależnie od tego, czy wskaźnik ważności wynosi 10 czy 11, otrzymujesz ostateczną instrukcję PRINT.
Skrypt testowy:
Wyniki:
Jedynym sposobem, aby to zadziałało, jest napisanie skryptu bez
GO
instrukcji. Czasami to łatwe. Czasami jest to dość trudne. (Użyj czegoś takiegoIF @error <> 0 BEGIN ...
.)źródło
Korzystam
RETURN
tu cały czas, pracuje w skrypcie lubStored Procedure
Upewnij się, że
ROLLBACK
transakcja, jeśli jesteś w jednym, w przeciwnym razieRETURN
natychmiast spowoduje otwartą, niezaangażowaną transakcjęźródło
To było moje rozwiązanie:
...
źródło
Możesz użyć instrukcji GOTO. Spróbuj tego. To jest pełne wykorzystanie dla ciebie.
źródło
Dziękuję za odpowiedź!
raiserror()
działa dobrze, ale nie należy zapominać oreturn
instrukcji, w przeciwnym razie skrypt będzie działał bezbłędnie! (henser ten nie jest „thrrowrorem” ;-)) i oczywiście w razie potrzeby wycofuje się!raiserror()
miło jest powiedzieć osobie wykonującej skrypt, że coś poszło nie tak.źródło
Jeśli po prostu wykonujesz skrypt w Management Studio i chcesz zatrzymać wykonanie lub wycofanie transakcji (jeśli jest używana) przy pierwszym błędzie, to moim zdaniem najlepszym sposobem jest użycie try catch block (SQL 2005 i nowsze). Działa to dobrze w Management studio, jeśli wykonujesz plik skryptu. Przechowywany proc może również z niego korzystać.
źródło
Wcześniej używaliśmy następujących ... działało najlepiej:
źródło
Umieść go w bloku try catch, a następnie wykonanie zostanie przekazane do złapania.
źródło