Udostępnij za pośrednictwem


Pobiera informacje o błędach języka Transact-SQL

Istnieją dwa sposoby uzyskiwania informacji o błędzie w Transact-SQL:

  • W ramach zakres blok CATCH konstrukcja TRY…CATCH, 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óre mogą być zwracane do aplikacji.Tekst zawiera wartości dostarczone parametrów wymiennych, takich jak długości nazw obiektów i godziny.

    • ERROR_NUMBER() zwraca numer błędu.

    • ERROR_PROCEDURE() zwraca nazwę procedura przechowywana lub wyzwalacz, w którym wystąpił błąd.Ta funkcja zwraca wartość NULL, jakby błąd nie wystąpił w procedurze przechowywanej lub wyzwalacza.

    • ERROR_SEVERITY() zwraca wagę.

    • ERROR_STATE() zwraca stan.

  • Natychmiast po wykonywania żadnych Transact-SQL instrukcja, można sprawdzić błąd i pobrać za pomocą funkcja @@ błędu numer błędu.

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 tylko zwracają informacje o błędzie, gdy są one używane w zakresie blok CATCH konstrukcji TRY…CATCH.Poza zakres blok CATCH zwracały wartość NULL.Funkcje te zwracają informacje o błędzie, który spowodował blok CATCH do wywołania.Zwracają te same informacje o dowolnym miejscu, są one uruchamiane w ramach zakres blok CATCH, nawet jeśli są one wywoływane wiele razy.Funkcje umożliwiają Transact-SQL Instrukcje te same dane, które są zwracane do aplikacji.

W blokach CATCH zagnieżdżone ERROR_LINE, ERROR_MESSAGE, ERROR_NUMBER, ERROR_PROCEDURE, ERROR_SEVERITY i ERROR_STATE funkcji powrotu do połowy informacje o błędach zablokować w których są one wywoływane.Na przykład blok CATCH zewnętrzne konstrukcja TRY... CATCH może mieć zagnieżdżonych konstrukcja TRY... CATCH.W obrębie blok CATCH zagnieżdżone funkcje zwracają informacje o błędzie, która wywołała wewnętrzne blok CATCH.Te same funkcje z zewnątrz blok CATCH zwróci informacje o błędzie, która wywołała tego blok CATCH.

Poniższy przykład ilustruje to dzięki możliwości wyświetlania, że gdy ERROR_MESSAGE odwołuje się do zewnętrznego blok CATCH, zwraca wygenerowany przez zewnętrzne blok TRY tekst wiadomości.Odwołania w blok CATCH wewnętrzne, ERROR_MESSAGE zwraca wygenerowany w wewnętrznej blok TRY tekst.W przykładzie pokazano również, czy w zewnętrznej CATCH blok ERROR_MESSAGE zawsze zwraca komunikat wygenerowany w blok TRY zewnętrzne, nawet po uruchomieniu wewnętrzne konstrukcja TRY... CATCH.

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żna użyć do przechwycenia liczbę generowanych przez poprzedni błąd Transact-SQL Instrukcja. @@ Błąd zwraca tylko informacje o błędach bezpośrednio po Transact-SQL instrukcja generuje błąd.

  • Jeśli instrukcja generuje błąd znajduje się w blok TRY, wartość @@ błędu musi być przetestowane i pobierane w pierwszej instrukcji w skojarzonym blok CATCH.

  • Instrukcja generuje błąd, nie znajduje się w blok TRY, wartość @@ błędu musi być przetestowane i pobierana w instrukcji, bezpośrednio po jednej, generowanie błędu.

Poza zakresem blok CATCH numer błędu w @@ błąd jest tylko dostępne informacje o błędzie w ciągu Transact-SQL Kod. Jeżeli błąd się komunikat o błędzie, zdefiniowany w sys.messages, można pobrać określonych błędów i wskaźnik ważności tekst komunikatu z sys.messages , jak pokazano w poniższym 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