Partager via


@@ERROR (Transact-SQL)

S’applique à : SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) SQL analytics endpoint in Microsoft Fabric Warehouse in Microsoft Fabric

Retourne le numéro d'erreur pour la dernière instruction Transact-SQL exécutée.

Conventions de la syntaxe Transact-SQL

Syntaxe

@@ERROR  

Types de retour

entier

Remarques

Retourne 0 si l'instruction Transact-SQL précédente n'a rencontré aucune erreur.

Retourne un numéro d'erreur si l'instruction précédente a rencontré une erreur. Si l'erreur est l'une des erreurs de la vue de catalogue sys.messages, alors @@ERROR contient la valeur provenant de la colonne sys.messages.message_id pour cette erreur. Vous pouvez consulter le texte associé à un numéro d'erreur @@ERROR dans sys.messages.

@@ERROR étant effacé et réinitialisé à chaque exécution d'une instruction, vérifiez cette valeur immédiatement après la vérification de l'instruction ou enregistrez-la dans une variable locale de façon à pouvoir la consulter ultérieurement.

Utilisez la construction TRY...CATCH pour la gestion des erreurs. La construction TRY...CATCH prend également en charge les fonctions système (ERROR_LINE, ERROR_MESSAGE, ERROR_PROCEDURE, ERROR_SEVERITY et ERROR_STATE) qui retournent plus d'informations sur les erreurs que @@ERROR. TRY...CATCH prend également en charge une fonction ERROR_NUMBER qui ne se limite pas à retourner le numéro d'erreur dans l'instruction qui suit immédiatement l'instruction qui a généré l'erreur. Pour plus d’informations, consultez TRY...CATCH (Transact-SQL).

Exemples

R. Utilisation de @@ERROR pour détecter une erreur spécifique

L'exemple suivant utilise @@ERROR pour rechercher une violation de contrainte de vérification (erreur n° 547) dans une instruction UPDATE.

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. Utilisation de @@ERROR pour quitter une procédure de façon conditionnelle

L’exemple suivant utilise les instructions IF...ELSE pour tester @@ERROR après une instruction DELETE dans une procédure stockée. La valeur de la variable @@ERROR détermine le code de retour envoyé au programme appelant pour indiquer la réussite ou l'échec de la procédure.

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. Utilisation de @@ERROR avec @@ROWCOUNT

L'exemple suivant utilise @@ERROR avec @@ROWCOUNT pour valider l'opération d'une instruction UPDATE. La valeur de @@ERROR permet de déterminer la présence d'une erreur et @@ROWCOUNT permet de s'assurer que la mise à jour d'une ligne de la table a bien eu lieu.

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  

Voir aussi

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)
Références relatives aux erreurs et aux événements (moteur de base de données)