Partager via


@@ERROR (Transact-SQL)

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

Icône Lien de rubriqueConventions de la syntaxe de Transact-SQL

Syntaxe

@@ERROR

Notes

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.

Le Moteur de base de données SQL Server 2005 propose la nouvelle 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).

Types de retour

integer

Exemples

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

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

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

B. Utilisation de @@ERROR pour quitter une procédure de façon conditionnelle

Les instructions IF...ELSE de cet exemple testent la valeur de @@ERROR après une instruction INSERT 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 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. Utilisation de @@ERROR avec @@ROWCOUNT

Cet exemple utilise @@ERROR avec @@ROWCOUNT pour valider l'exécution 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 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, 
    @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

Voir aussi

Référence

ERROR_LINE (Transact-SQL)
ERROR_MESSAGE (Transact-SQL)
ERROR_NUMBER (Transact-SQL)
ERROR_PROCEDURE (Transact-SQL)
ERROR_SEVERITY (Transact-SQL)
ERROR_STATE (Transact-SQL)
TRY...CATCH (Transact-SQL)
@@ROWCOUNT (Transact-SQL)
SET @local\_variable (Transact-SQL)
sys.messages (Transact-SQL)
Fonctions système (Transact-SQL)

Autres ressources

Gestion des erreurs du moteur de base de données
Utilisation de @@ERROR
Utilisation de TRY...CATCH dans Transact-SQL

Aide et Informations

Assistance sur SQL Server 2005