Gdy coś pójdzie nie tak w T-SQL, chcesz szybko naprawić problem przy minimalnym kopaniu i zakłócaniu pracy użytkowników. Komunikaty o błędach generowane przez program SQL Server są wysoce techniczne i trudne do zrozumienia, co może utrudnić izolowanie problemów i spowolnić czas rozwiązywania problemów. Na szczęście administratorzy baz danych mogą zaimplementować SQL Server RAISERROR jako alternatywę dla komunikatów o błędach SQL Server.
RAISERROR to instrukcja obsługi błędów programu SQL Server, która generuje komunikat o błędzie i inicjuje przetwarzanie błędów. RAISERROR może albo odwoływać się do komunikatu zdefiniowanego przez użytkownika, który jest przechowywany w widoku katalogu sys.messages, albo może tworzyć komunikat dynamicznie. Komunikat jest zwracany jako komunikat o błędzie serwera do aplikacji wywołującej lub do skojarzonego bloku CATCH konstrukcji TRY...CATCH.
Istnieje kilka scenariuszy, w których właściwe jest użycie instrukcji RAISERROR:
- Rozwiązywanie problemów z kodem Transact-SQL
- Zwracanie wiadomości zawierających zmienny tekst
- Badanie wartości danych
- Kiedy potrzebujesz wykonania, aby przeskoczyć z bloku TRY do skojarzonego bloku CATCH lub zwrócić informacje o błędzie z bloku CATCH do wywołujących
Należy zauważyć, że podczas tworzenia nowych aplikacji, instrukcja THROW jest teraz preferowana do obsługi błędów niż RAISERROR. Ale o tym później.
Dlaczego używać RAISERROR do obsługi błędów programu SQL Server?
Istnieją dwa główne powody wyboru RAISERROR zamiast obsługi błędów generowanych przez SQL Server:
- Komunikaty RAISERROR można dostosować pod względem poziomu ważności i stanu
- Mogą być napisane w języku naturalnym, który jest łatwy do zrozumienia
RAISERROR zwraca komunikaty o błędach do aplikacji w tym samym formacie, który jest generowany przez Aparat baz danych programu SQL Server. Umożliwia programistom generowanie własnych komunikatów o błędach, dzięki czemu każdy, kto czyta komunikat, będzie mógł zrozumieć, na czym polega rzeczywisty problem, zamiast próbować odszyfrować komunikat o błędzie technicznym SQL Server. Deweloperzy mogą również ustawić własny poziom ważności, identyfikator komunikatu i stan komunikatów o błędach.
Używanie RAISERROR z konstrukcją TRY...CATCH
TRY...CATCH to konstrukcja obsługi błędów, która umożliwia wykonanie kodu w sekcji TRY i obsługę błędów w sekcji CATCH. Ogólnie rzecz biorąc, TRY...CATCH jest skutecznym sposobem identyfikacji wielu błędów T-SQL, ale istnieje kilka wyjątków.
Ten samouczek zawiera szczegółowy przewodnik dotyczący używania RAISERROR w połączeniu z TRY...CATCH. Autor używa przykładu pokazującego, jak użyć RAISERROR wewnątrz bloku TRY, aby spowodować, że wykonanie przeskoczy do skojarzonego bloku CATCH. Wewnątrz bloku CATCH autor pokazuje, jak użyć RAISERROR do zwrócenia informacji o błędzie, które wywołały blok CATCH. Dane wyjściowe wyświetlają identyfikator wiadomości, poziom ważności i stan błędu.
RAISERROR vs. THROW Instrukcje obsługi błędów
RAISERROR został wprowadzony w SQL Server 7.0 i od wielu lat jest skutecznym sposobem obsługi błędów T-SQL. Ale jeśli tworzysz nowe aplikacje, firma Microsoft zaleca teraz używanie instrukcji THROW zamiast RAISERROR.
Wraz z aktualizacją organizacji do wersji SQL Server 2012 i nowszych, program RAISERROR jest wycofywany. W rzeczywistości RAISERROR nie może być używany w natywnie skompilowanych procedurach składowanych programu SQL Server 2014. THROW jest uważany za ulepszenie w stosunku do RAISERROR, ponieważ jest łatwiejszy w użyciu.
Dokumentacja Microsoft SQL Server przedstawia różnice między instrukcjami obsługi błędów RAISERROR i THROW w następujący sposób:
Oświadczenie RAISERROR
- Jeśli msg_id jest przekazywany do RAISERROR, identyfikator musi być zdefiniowany w sys.messages.
- Parametr msg_str może zawierać style formatowania printf.
Parametr ważności określa wagę wyjątku.
Oświadczenie THROW
- Parametr numer_błędu nie musi być zdefiniowany w sys.messages.
- Parametr wiadomości nie akceptuje formatowania stylu printf.
- Brak parametru ważności. Ważność wyjątku jest zawsze ustawiona na 16.
Chociaż dni RAISERROR mogą być ponumerowane, pozostaje realną opcją obsługi błędów w starszych wersjach SQL Server. Firma Microsoft zachęca użytkowników nowszych wersji programu SQL Server (SQL SERVER 2012 i nowsze) do używania instrukcji THROW zamiast RAISERROR do implementacji obsługi błędów. Microsoft nie ogłosił jeszcze wycofania RAISERROR, ale wydaje się prawdopodobne, że prędzej niż później.