Freigeben über


@@ERROR (Transact-SQL)

Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) SQL Analytics-Endpunkt in Microsoft Fabric Warehouse in Microsoft Fabric

Gibt die Fehlernummer für die zuletzt ausgeführte Transact-SQL-Anweisung zurück.

Transact-SQL-Syntaxkonventionen

Syntax

@@ERROR  

Rückgabetypen

integer

Hinweise

Gibt 0 zurück, wenn bei der vorherigen Transact-SQL-Anweisung keine Fehler auftraten.

Gibt eine Fehlernummer zurück, wenn bei der vorherigen Anweisung ein Fehler auftrat. Wenn es sich bei dem Fehler um einen der Fehler in der sys.messages-Katalogsicht handelt, enthält @@ERROR den Wert der sys.messages.message_id-Spalte dieses Fehlers. Sie können den zu einer @@ERROR-Fehlernummer gehörenden Text in sys.messages anzeigen.

Da @@ERROR nach jeder ausgeführten Anweisung gelöscht und zurückgesetzt wird, sollten Sie den Fehler sofort nach Überprüfung der Anweisung überprüfen oder ihn in einer lokalen Variablen speichern, die zu einem späteren Zeitpunkt überprüft werden kann.

Verwenden Sie das TRY...CATCH-Konstrukt zur Behandlung von Fehlern. Das TRY...CATCH-Konstrukt unterstützt auch zusätzliche Systemfunktionen (ERROR_LINE, ERROR_MESSAGE, ERROR_PROCEDURE, ERROR_SEVERITY und ERROR_STATE), die mehr Fehlerinformationen als @@ERROR zurückgeben. TRY...CATCH unterstützt darüber hinaus eine ERROR_NUMBER-Funktion, die nicht darauf beschränkt ist, die Fehlernummer in der Anweisung zurückzugeben, die unmittelbar auf die Anweisung folgt, die einen Fehler generiert hat. Weitere Informationen finden Sie unter TRY...CATCH (Transact-SQL).

Beispiele

A. Verwenden von @@ERROR zum Erkennen eines bestimmten Fehlers

Im folgenden Beispiel wird @@ERROR verwendet, um nach einer Verletzung einer CHECK-Einschränkung (Fehlernr. 547) in einer UPDATE-Anweisung zu suchen.

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

B. Verwenden von @@ERROR zur bedingten Beendigung einer Prozedur

In den folgenden Beispielen werden IF...ELSE-Anweisungen verwendet, um @@ERROR nach einer DELETE-Anweisung in einer gespeicherten Prozedur zu testen. Der Wert der @@ERROR-Variablen bestimmt den an das aufrufende Programm gesendeten Rückgabecode und gibt damit den Erfolg oder das Fehlschlagen der Prozedur an.

USE AdventureWorks2022;  
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. Verwenden von @@ERROR mit @@ROWCOUNT

Im folgenden Beispiel wird @@ERROR mit @@ROWCOUNT verwendet, um den Vorgang einer UPDATE-Anweisung zu überprüfen. Der Wert von @@ERROR wird auf Fehler überprüft, und @@ROWCOUNT wird verwendet, um sicherzustellen, dass das Update erfolgreich auf eine Zeile in der Tabelle angewendet wurde.

USE AdventureWorks2022;  
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  

Siehe auch

TRY...CATCH (Transact-SQL)
ERROR_LINE (Transact-SQL)
ERROR_MESSAGE (Transact-SQL)
ERROR_NUMBER (Transact-SQL)
ERROR_PROCEDURE (Transact-SQL)
ERROR_SEVERITY (Transact-SQL)
ERROR_STATE (Transact-SQL)
@@ROWCOUNT (Transact-SQL)
sys.messages (Transact-SQL)
Fehler- und Ereignisreferenz (Datenbank-Engine)