Udostępnij za pośrednictwem


Błąd @@ (Transact-SQL)

Zwraca numer błędu dla ostatniego Transact-SQL instrukcja wykonywane.

Ikona łącza do tematuJęzyka Transact-SQL składni konwencje

Składnia

@@ERROR

Zwracane typy

integer

Uwagi

Zwraca wartość 0, jeśli poprzedni Transact-SQL instrukcja napotkano żadnych błędów.

Zwraca numer błędu, jeśli poprzednie instrukcja napotkał błąd.Jeżeli błąd był jeden z błędów w widoku katalog sys.messages, błąd @@ zawiera wartość z kolumna sys.messages.message_id dla tego błędu.Można wyświetlać tekst skojarzony z @@ błąd numer błędu w sys.messages.

Ponieważ @@ błąd jest wyczyszczone i resetowania każdej instrukcja wykonywane, sprawdź go natychmiast po instrukcja sprawdzanym lub zapisać do zmiennej lokalnej, która może zostać sprawdzona później.

Użyj SPRÓBUJ...CATCH konstrukcja obsługi błędów.SPRÓBUJ...Konstrukcja połowu obsługuje także dodatkowe funkcje systemowe (ERROR_LINE, ERROR_MESSAGE, ERROR_PROCEDURE, ERROR_SEVERITY i ERROR_STATE), która zwraca więcej informacji o błędzie niż @@ błąd.SPRÓBUJ...POŁÓW obsługuje również ERROR_NUMBER funkcja , która nie jest ograniczony do zwracania numer błędu w instrukcja natychmiast po instrukcja wygenerowany błąd.Aby uzyskać więcej informacji, zobacz TRY...CATCH (Transact-SQL).

Przykłady

A.wykrywać błędu przy użyciu @@ błąd

W poniższym przykładzie użyto @@ERROR do sprawdzania wyboru naruszenie ograniczenia (błąd # 547) w UPDATE instrukcja.

USE AdventureWorks2008R2;
GO
UPDATE HumanResources.EmployeePayHistory
    SET PayFrequency = 4
    WHERE BusinessEntityID = 1;
IF @@ERROR = 547
    PRINT N'A check constraint violation occurred.';
GO

B.Warunkowo zakończyć procedurę przy użyciu @@ błąd

Poniższe przykłady używa IF...ELSE instrukcji, aby przetestować @@ERROR po INSERT instrukcja w procedura składowana.Wartość @@ERROR zmiennej określa kod zwrotny wysłane do programu wywołującego powodzeniu lub niepowodzeniu procedury.

USE AdventureWorks2008R2;
GO
-- Drop the procedure if it already exists.
IF OBJECT_ID(N'HumanResources.usp_DeleteCandidate', N'P') IS NOT NULL
    DROP PROCEDURE HumanResources.usp_DeleteCandidate;
GO
-- Create the procedure.
CREATE PROCEDURE HumanResources.usp_DeleteCandidate 
    (
    @CandidateID INT
    )
AS
-- Execute the DELETE statement.
DELETE FROM HumanResources.JobCandidate
    WHERE JobCandidateID = @CandidateID;
-- Test the error value.
IF @@ERROR <> 0 
    BEGIN
        -- Return 99 to the calling program to indicate failure.
        PRINT N'An error occurred deleting the candidate information.';
        RETURN 99;
    END
ELSE
    BEGIN
        -- Return 0 to the calling program to indicate success.
        PRINT N'The job candidate has been deleted.';
        RETURN 0;
    END;
GO

C.Przy użyciu @@ ROWCOUNT @@ błąd

W poniższym przykładzie użyto @@ERROR z @@ROWCOUNT do sprawdzania poprawności działania UPDATE instrukcja.Wartość @@ERROR jest sprawdzana jakiekolwiek oznaczenie błąd, i @@ROWCOUNT jest używana do zapewnienia, że aktualizacja została pomyślnie zastosowana do wiersza w tabela.

USE AdventureWorks2008R2;
GO
IF OBJECT_ID(N'Purchasing.usp_ChangePurchaseOrderHeader',N'P')IS NOT NULL
    DROP PROCEDURE Purchasing.usp_ChangePurchaseOrderHeader;
GO
CREATE PROCEDURE Purchasing.usp_ChangePurchaseOrderHeader
    (
    @PurchaseOrderID INT
    ,@BusinessEntityID INT
   )
AS
-- Declare variables used in error checking.
DECLARE @ErrorVar INT;
DECLARE @RowCountVar INT;

-- Execute the UPDATE statement.
UPDATE PurchaseOrderHeader 
    SET BusinessEntityID = @BusinessEntityID 
    WHERE PurchaseOrderID = @PurchaseOrderID;

-- Save the @@ERROR and @@ROWCOUNT values in local 
-- variables before they are cleared.
SELECT @ErrorVar = @@ERROR
    ,@RowCountVar = @@ROWCOUNT;

-- Check for errors. If an invalid @BusinessEntityID was specified,
-- the UPDATE statement returns a foreign key violation error #547.
IF @ErrorVar <> 0
    BEGIN
        IF @ErrorVar = 547
            BEGIN
                PRINT N'ERROR: Invalid ID specified for new employee.';
                 RETURN 1;
            END
        ELSE
            BEGIN
                PRINT N'ERROR: error '
                    + RTRIM(CAST(@ErrorVar AS NVARCHAR(10)))
                    + N' occurred.';
                RETURN 2;
            END
    END

-- Check the row count. @RowCountVar is set to 0 
-- if an invalid @PurchaseOrderID was specified.
IF @RowCountVar = 0
    BEGIN
        PRINT 'Warning: The BusinessEntityID specified is not valid';
        RETURN 1;
    END
ELSE
    BEGIN
        PRINT 'Purchase order updated with the new employee';
        RETURN 0;
    END;
GO