Instrukcja SQL RAISERROR służy do wysyłania niestandardowego komunikatu do aplikacji klienckiej. Może być również używany do debugowania aplikacji i dotyczy mechanizmu obsługi błędów.
Składnia i parametry instrukcji SQL RAISERROR
Składnia instrukcji SQL RAISERROR jest następująca:
RAISERROR ( { message_text | message_id | @local_variable }
{ ,severity ,state }
[ ,argument [ ,...n ] ]
[ WITH option [ ,...n ] ];
Poniżej znajduje się wyjaśnienie parametrów słowa kluczowego RAISERROR, które można określić:
message_text – komunikat, który chcesz wyświetlić w przypadku błędu. Uwaga: Możemy dodać niestandardowe komunikaty, aby pokazać informacje o błędzie. Zobacz to wyjaśnione w drugiej części artykułu.
message_id – identyfikator komunikatu o błędzie. Jeśli chcesz wyświetlić komunikat zdefiniowany przez użytkownika, musisz go zdefiniować. Wyświetl listę identyfikatorów wiadomości w sys.messages DMV .
Zapytanie
select * from sys.messages
Wynik:
dotkliwość – wagę błędu. Typ danych dotkliwości zmienna jest mały , a wartości mieszczą się w zakresie od 0 do 25. Prawidłowe wartości wagi błędu są następujące:
- 0-10 – komunikaty informacyjne
- 11-18 – błędy
- 19-25 – błędy krytyczne
Uwaga : Jeśli utworzysz wiadomość zdefiniowaną przez użytkownika, ważność określona w komunikacie zdefiniowanym przez użytkownika zostanie zastąpiona ważnością określoną w instrukcji RAISERROR.
stan – unikalny numer identyfikacyjny, za pomocą którego można zidentyfikować sekcję kodu powodującą błąd. Typ danych parametru stanu jest mały , a wartości mieszczą się w zakresie od 0 do 255.
Przejdźmy teraz do praktycznych przykładów.
Przykład 1:Użyj instrukcji RAISERROR programu SQL Server do wydrukowania danych wyjściowych
W tym przykładzie możesz zobaczyć, jak możemy wyświetlić komunikat o błędzie lub komunikat informacyjny za pomocą instrukcji RAISERROR.
Załóżmy, że chcesz wyświetlić komunikat po wstawieniu rekordów do tabeli. Możemy użyć instrukcji SQL PRINT lub RAISERROR. Oto kod:
SET nocount ON
INSERT INTO tblpatients
(patient_id,
patient_name,
address,
city)
VALUES ('OPD00006',
'Nimesh Upadhyay',
'AB-14, Ratnedeep Flats',
'Mehsana')
RAISERROR ( 'Patient detail added successfully',1,1)
Wynik:
Jak widać na powyższym obrazku, identyfikator wiadomości to 50000, ponieważ jest to wiadomość zdefiniowana przez użytkownika.
Przykład 2:Instrukcja SQL RAISERROR z dynamicznym tekstem komunikatu
Zobacz teraz, jak możemy utworzyć dynamiczny tekst wiadomości dla instrukcji SQL RAISERROR.
Załóżmy, że w wiadomości chcemy wydrukować identyfikator pacjenta. Zdefiniowałem zmienną lokalną o nazwie @IdPacjenta , który przechowuje identyfikator pacjenta . Aby wyświetlić wartość @patientID w tekście wiadomości możemy użyć następującego kodu:
DECLARE @PatientID VARCHAR(15)
DECLARE @message NVARCHAR(max)
SET @PatientID='OPD00007'
SET @message ='Patient detail added successfully. The OPDID is %s'
INSERT INTO tblpatients
(patient_id,
patient_name,
address,
city)
VALUES ('' + @PatientID + '',
'Nimesh Upadhyay',
'AB-14, Ratnedeep Flats',
'Mehsana')
RAISERROR ( @message,1,1,@patientID)
Wynik:
Aby wyświetlić ciąg w instrukcji RAISERROR, musimy użyć instrukcji print w stylu C.
Jak widać na powyższym obrazku, do wyświetl parametr w tekście wiadomości, użyłem opcji %s który wyświetla wartość ciągu parametru . Jeśli chcesz wyświetlić parametr całkowity , możesz użyć opcji %d .
Użyj SQL RAISERROR w bloku TRY..CATCH
W tym przykładzie dodajemy SQL RAISERROR w bloku TRY. Kiedy uruchamiamy ten kod, jest on wykonywany do skojarzonego bloku CATCH. W bloku CATCH wyświetlimy szczegóły wywołanego błędu.
BEGIN try
RAISERROR ('Error invoked in the TRY code block.',16,1 );
END try
BEGIN catch
DECLARE @ErrorMsg NVARCHAR(4000);
DECLARE @ErrSeverity INT;
DECLARE @ErrState INT;
SELECT @ErrorMsg = Error_message(),
@ErrSeverity = Error_severity(),
@ErrState = Error_state();
RAISERROR (@ErrorMsg,
@ErrSeverity,
@ErrState
);
END catch;
W związku z tym dodaliśmy stwierdzenie RAISERROR o ważności między 11 -19. Powoduje wykonanie bloku CATCH.
W bloku CATCH pokazujemy informacje o pierwotnym błędzie za pomocą instrukcji RAISERROR.
Wynik:
Jak widać, kod zwrócił informacje o pierwotnym błędzie.
Teraz wyjaśnijmy, jak możemy dodać niestandardową wiadomość za pomocą sp_addmessage procedura składowana.
procedura zapisana sp_addmessage
Możemy dodać wiadomość niestandardową, wykonując sp_addmessages procedura składowana. Składnia to:
EXEC Sp_addmessage
@msgnum= 70001,
@severity=16,
@msgtext='Please enter the numeric value',
@lang=NULL,
@with_log='TRUE',
@replace='Replace';
@msgnum: Podaj numer wiadomości. Typ danych parametru to liczba całkowita. Jest to identyfikator wiadomości zdefiniowanej przez użytkownika.
@ważność: Określ poziom ważności błędu. Prawidłowe wartości mieszczą się w zakresie od 1 do 25. Typ danych parametru to smallint.
@messagetext: Określ komunikat, który chcesz wyświetlić. Typ danych parametru to nvarchar(255), a domyślna wartość to NULL.
@lang: Określ język, którego chcesz używać do wyświetlania komunikatu o błędzie. Wartość domyślna to NULL.
@with_log: Ten parametr służy do zapisania wiadomości do przeglądarki zdarzeń. Prawidłowe wartości to TRUE i FALSE. Jeśli określisz TRUE, komunikat o błędzie zostanie zapisany w przeglądarce zdarzeń systemu Windows. Jeśli wybierzesz FALSE, błąd nie zostanie zapisany w dzienniku błędów systemu Windows.
@replace: Jeśli chcesz zastąpić istniejący komunikat o błędzie komunikatem zdefiniowanym przez użytkownika i poziomem ważności, możesz określić zastąpienie w procedurze składowanej.
Załóżmy, że chcesz utworzyć komunikat o błędzie, który zwraca nieprawidłową jakość błąd. W instrukcji INSERT wartość ilości_produktu wynosi od 20 do 100. Wiadomość powinna być traktowana jako błąd, a ważność wynosi 16.
Aby utworzyć wiadomość, uruchom następujące zapytanie:
USE master;
go
EXEC Sp_addmessage
70001,
16,
N'Product Quantity must be between 20 and 100.';
go
Po dodaniu wiadomości uruchom poniższe zapytanie, aby ją wyświetlić:
USE master
go
SELECT * FROM sys.messages WHERE message_id = 70001
Wynik:
Jak korzystać z komunikatów o błędach zdefiniowanych przez użytkownika
Jak wspomniałem wcześniej, musimy użyć message_id w instrukcji RAISERROR dla wiadomości zdefiniowanych przez użytkownika.
Stworzyliśmy wiadomość o identyfikatorze 70001. Wyrażenie RAISERROR powinno wyglądać następująco:
USE master
go
RAISERROR (70001,16,1 );
go
Wynik:
Instrukcja RAISERROR zwróciła wiadomość zdefiniowaną przez użytkownika.
procedura przechowywana sp_dropmessage
wiadomość sp_drop procedura składowana służy do usuwania wiadomości zdefiniowanych przez użytkownika. Składnia jest następująca:
EXEC Sp_dropmessage @msgnum
W składni @msgnum określa identyfikator wiadomości, którą chcesz usunąć.
Teraz chcemy usunąć wiadomość, której identyfikator to 70001 . Zapytanie jest następujące:
EXEC Sp_dropmessage 70001
Po usunięciu wiadomości uruchom następujące zapytanie, aby ją wyświetlić:
USE master
go
SELECT * FROM sys.messages WHERE message_id = 70001
Wynik:
Jak widać, wiadomość została usunięta.
Podsumowanie
W związku z tym zbadaliśmy instrukcję RAISERROR, jej parametry i zademonstrowaliśmy jej zastosowanie na praktycznych przykładach. Wyjaśniliśmy również użycie sp_addmessage i sp_dropmessage procedury składowane. Mam nadzieję, że ten artykuł przyniósł Ci przydatne informacje dotyczące Twoich celów roboczych.
Zawsze chętnie wysłuchamy Twoich komentarzy i być może dodatkowych praktycznych wskazówek, jeśli chcesz się nimi podzielić.