Udostępnij za pośrednictwem


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