@@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)