Trwa pobieranie informacji o błędach języka Transact-SQL
Istnieją dwa sposoby uzyskiwania informacji o błędzie w Transact-SQL:
W zakres blok CATCH TRY…Konstrukcja połowu, można użyć następujących funkcje systemowe:
ERROR_LINE() zwraca numer wiersza, w którym wystąpił błąd.
ERROR_MESSAGE() zwraca tekst wiadomości, która zostałaby zwrócona do aplikacji.Tekst zawiera wartości dostarczonych parametrów wymiennych, takich jak długość, nazwy obiektów lub godzin.
ERROR_NUMBER() zwraca numer błędu.
ERROR_PROCEDURE() zwraca nazwę procedura składowana lub wyzwalacz, w którym wystąpił błąd.Ta funkcja zwraca wartość NULL, jeśli błąd nie wystąpił wewnątrz procedura składowana lub wyzwalacza.
ERROR_SEVERITY() zwraca dotkliwości.
ERROR_STATE() zwraca stan.
Natychmiast po wykonywanie żadnych Transact-SQL instrukcja, można testować błąd i pobrać numer błędu przy użyciu funkcja @@ błąd.
Za pomocą ERROR_LINE, ERROR_MESSAGE, ERROR_NUMBER, ERROR_PROCEDURE, ERROR_SEVERITY i ERROR_STATE
Funkcje ERROR_LINE, ERROR_MESSAGE, ERROR_NUMBER, ERROR_PROCEDURE, ERROR_SEVERITY i ERROR_STATE zwracają tylko informacje o błędzie, jeśli są używane w zakres blok CATCH TRY…CATCH konstrukcji.Poza zakres bloku CATCH zwracały wartość NULL.Funkcje te zwracają informacje o błędzie, który spowodował blok CATCH do wywołania.Funkcje zwracają te same informacje o błędach, gdziekolwiek są one uruchamiane w ramach zakres bloku CATCH, nawet jeśli są one wywoływane wiele razy.Funkcje umożliwiają Transact-SQL sprawozdania te same dane, które są zwracane do aplikacji.
W zagnieżdżonych połowu bloks, ERROR_LINE, ERROR_MESSAGE, ERROR_NUMBER, ERROR_PROCEDURE, ERROR_SEVERITY i ERROR_STATE zwracają błąd informacji określonych połowu blok , w której jest odwołanie.Na przykład blok CATCH SPRÓBUJ zewnętrzne...Konstrukcja CATCH może mieć zagnieżdżonych SPRÓBUJ...CATCH konstrukcji.W ramach zagnieżdżony blok CATCH funkcje zwracają informacje o błędzie, która wywołała wewnętrzne blok CATCH.Te same funkcje w zewnętrznej blok CATCH zwróci informacje o błędzie, która wywołała danego bloku CATCH.
Poniższy przykład ilustruje to pokazując, że gdy ERROR_MESSAGE odwołuje się do zewnętrznego blok CATCH, zwraca tekst wiadomości generowany przez zewnętrzne bloku TRY.Po odwołaniu w wewnętrzne blok CATCH ERROR_MESSAGE zwraca tekst wygenerowany w wewnętrznej bloku TRY.W przykładzie zilustrowano również, że w blok CATCH zewnętrznego ERROR_MESSAGE zawsze zwraca komunikat generowany w zewnętrznej blok TRY, nawet po wewnętrznej SPRÓBUJ...CATCH konstrukcja został uruchomiony.
IF EXISTS (SELECT message_id FROM sys.messages
WHERE message_id = 50010)
EXECUTE sp_dropmessage 50010;
GO
EXECUTE sp_addmessage @msgnum = 50010,
@severity = 16,
@msgtext = N'Message text is from the %s TRY block.';
GO
BEGIN TRY -- Outer TRY block.
-- Raise an error in the outer TRY block.
RAISERROR (50010, -- Message id.
16, -- Severity,
1, -- State,
N'outer'); -- Indicate TRY block.
END TRY -- Outer TRY block.
BEGIN CATCH -- Outer CATCH block.
-- Print the error message recieved for this
-- CATCH block.
PRINT N'OUTER CATCH1: ' + ERROR_MESSAGE();
BEGIN TRY -- Inner TRY block.
-- Start a nested TRY...CATCH and generate
-- a new error.
RAISERROR (50010, -- Message id.
16, -- Severity,
2, -- State,
N'inner'); -- Indicate TRY block.
END TRY -- Inner TRY block.
BEGIN CATCH -- Inner CATCH block.
-- Print the error message recieved for this
-- CATCH block.
PRINT N'INNER CATCH: ' + ERROR_MESSAGE();
END CATCH; -- Inner CATCH block.
-- Show that ERROR_MESSAGE in the outer CATCH
-- block still returns the message from the
-- error generated in the outer TRY block.
PRINT N'OUTER CATCH2: ' + ERROR_MESSAGE();
END CATCH; -- Outer CATCH block.
GO
Trwa pobieranie informacji o użyciu @@ błąd
Funkcja @@ błędu może być używana do przechwytywania liczbę generowanych przez poprzedni błąd Transact-SQL instrukcja.@@ Błąd zwraca tylko informacje o błędzie natychmiast po Transact-SQL instrukcja, która generuje błąd.
Jest instrukcja generuje błąd w blok TRY, wartość @@ błędu musi być przetestowane i pobierane w pierwszej instrukcji blok CATCH skojarzone.
Instrukcja generuje błąd nie jest w blok TRY, wartość @@ błędu musi być przetestowane i pobierane w instrukcji natychmiast po jednym generującego błąd.
Poza zakres blok CATCH numer błędu @@ błędu jest tylko informacji o błędzie w Transact-SQL kodu.Jeśli błąd komunikat o błędzie, określone w sys.messages, można pobrać określonych błędów i ważności tekst komunikatu z sys.messages jak pokazano w przykładzie.
IF EXISTS (SELECT message_id FROM sys.messages
WHERE message_id = 50010)
EXECUTE sp_dropmessage 50010;
GO
-- Define a message with text that accepts
-- a substitution string.
EXECUTE sp_addmessage @msgnum = 50010,
@severity = 16,
@msgtext = N'Substitution string = %s.';
GO
DECLARE @ErrorVariable INT;
-- RAISERROR uses a different severity and
-- supplies a substitution argument.
RAISERROR (50010, -- Message id.
15, -- Severity,
1, -- State,
N'ABC'); -- Substitution Value.
-- Save @@ERROR.
SET @ErrorVariable = @@ERROR;
-- The results of this select illustrate that
-- outside a CATCH block only the original
-- information from sys.messages is available to
-- Transact-SQL statements. The actual message
-- string returned to the application is not
-- available to Transact-SQL statements outside
-- of a CATCH block.
SELECT @ErrorVariable AS ErrorID,
text
FROM sys.messages
WHERE message_id = @ErrorVariable;
GO
Zobacz także