Udostępnij za pośrednictwem


Błąd @@ (języka Transact-SQL)

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

Topic link iconKonwencje składni języka Transact-SQL

@@ERROR

Zwracane typy

Liczba całkowita

Remarks

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

Zwraca błąd numer, jeżeli poprzednia napotkał błąd.Jeżeli błąd był jeden z błędów w widoku wykazu 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 po każdej instrukcja wykonywane, sprawdź go natychmiast po instrukcja, sprawdzanym lub zapisać go do zmiennej lokalnej, które mogą być kontrolowane później.

Konstrukcja TRY... CATCH służy do obsługi błędów.Konstrukcja TRY... CATCH obsługuje także funkcje dodatkowe systemu (ERROR_LINE ERROR_MESSAGE, ERROR_PROCEDURE, ERROR_SEVERITY i ERROR_STATE), które zwracają więcej informacji o błędzie niż @@ błąd.CATCH... TRY obsługuje też funkcja ERROR_NUMBER, która nie jest ograniczony do zwracania numer błędu w instrukcja natychmiast po instrukcja, który wygenerował błąd.Aby uzyskać więcej informacji zobacz... TRY CATCH (języka Transact-SQL).

Przykłady

A.Za pomocą @@ błąd określonego błędu

W tym przykładzie użyto @@ błąd, aby sprawdzić, czy naruszenie ograniczenia wyboru (błąd # 547) za pomocą instrukcja UPDATE.

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

B.Warunkowo zakończyć procedurę za pomocą błąd @@

Instrukcje IF... ELSE w tym przykładzie należy przetestować @@ błąd po instrukcja INSERT w procedurze przechowywanej.Wartość zmiennej @@ błąd określa kod zwrotny wysłane do programu wywołującego, wskazujące na powodzenie lub niepowodzenie procedury.

USE AdventureWorks;
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.Błąd @@ za pomocą ROWCOUNT @@

W tym przykładzie @@ błąd z @@ ROWCOUNT do sprawdzania poprawności działania instrukcja SQL UPDATE.Wartość @@ błąd jest sprawdzana pod kątem oznaczenie błędu i @@ ROWCOUNT jest używany do upewnij się, czy aktualizacja została pomyślnie zastosowana do wiersza w tabela.

USE AdventureWorks;
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
    ,@EmployeeID INT
   )
AS
-- Declare variables used in error checking.
DECLARE @ErrorVar INT;
DECLARE @RowCountVar INT;

-- Execute the UPDATE statement.
UPDATE PurchaseOrderHeader 
    SET EmployeeID = @EmployeeID 
    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 @EmployeeID 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 EmployeeID specified is not valid';
        RETURN 1;
    END
ELSE
    BEGIN
        PRINT 'Purchase order updated with the new employee';
        RETURN 0;
    END;
GO