@@ERROR (Transact-SQL)@@ERROR (Transact-SQL)

SE APLICA A: síSQL Server (a partir de 2008) síAzure SQL Database síAzure SQL Data Warehouse síAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Devuelve el número de error de la última instrucción Transact-SQLTransact-SQL ejecutada.Returns the error number for the last Transact-SQLTransact-SQL statement executed.

Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax

@@ERROR  

Tipos devueltosReturn Types

integerinteger

NotasRemarks

Devuelve 0 si la instrucción Transact-SQLTransact-SQL anterior no encontró errores.Returns 0 if the previous Transact-SQLTransact-SQL statement encountered no errors.

Devuelve un número de error si la instrucción anterior encontró un error.Returns an error number if the previous statement encountered an error. Si el error era uno de los errores de la vista de catálogo sys.messages, entonces @@ERROR contendrá el valor de la columna sys.messages.message_id para dicho error.If the error was one of the errors in the sys.messages catalog view, then @@ERROR contains the value from the sys.messages.message_id column for that error. Puede ver el texto asociado con el número de error @@ERROR en sys.messages.You can view the text associated with an @@ERROR error number in sys.messages.

Como @@ERROR se borra y restablece con cada instrucción ejecutada, debe comprobarlo inmediatamente después de la instrucción que se está comprobando o guardarlo en una variable local para examinarlo posteriormente.Because @@ERROR is cleared and reset on each statement executed, check it immediately following the statement being verified, or save it to a local variable that can be checked later.

Use la construcción TRY...CATCH para controlar errores.Use the TRY...CATCH construct to handle errors. La construcción TRY...CATCH también admite funciones de sistema adicionales (ERROR_LINE, ERROR_MESSAGE, ERROR_PROCEDURE, ERROR_SEVERITY y ERROR_STATE) que devuelven más información sobre errores que @@ERROR.The TRY...CATCH construct also supports additional system functions (ERROR_LINE, ERROR_MESSAGE, ERROR_PROCEDURE, ERROR_SEVERITY, and ERROR_STATE) that return more error information than @@ERROR. TRY...CATCH también admite una función ERROR_NUMBER que no se limita a devolver el número de error en la instrucción inmediatamente después de la instrucción que generó el error.TRY...CATCH also supports an ERROR_NUMBER function that is not limited to returning the error number in the statement immediately after the statement that generated an error. Para obtener más información, vea TRY...CATCH (Transact-SQL).For more information, see TRY...CATCH (Transact-SQL).

EjemplosExamples

A.A. Utilizar @@ERROR para detectar un error específicoUsing @@ERROR to detect a specific error

En el ejemplo siguiente se utiliza @@ERROR para comprobar si se infringe una restricción CHECK (error nº 547) en una instrucción UPDATE.The following example uses @@ERROR to check for a check constraint violation (error #547) in an UPDATE statement.

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

B.B. Utilizar @@ERROR para salir condicionalmente de un procedimientoUsing @@ERROR to conditionally exit a procedure

En el ejemplo siguiente se utilizan las instrucciones IF...ELSE para probar @@ERROR después de una instrucción DELETE en un procedimiento almacenado.The following example uses IF...ELSE statements to test @@ERROR after an DELETE statement in a stored procedure. El valor de la variable @@ERROR determina el código devuelto enviado al programa que llamó, lo que indica si el procedimiento se realizó correcta o incorrectamente.The value of the @@ERROR variable determines the return code sent to the calling program, indicating success or failure of the procedure.

USE AdventureWorks2012;  
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.C. Usar @@ERROR con @@ROWCOUNTUsing @@ERROR with @@ROWCOUNT

En el ejemplo siguiente se utiliza @@ERROR con @@ROWCOUNT para validar la operación de una instrucción UPDATE.The following example uses @@ERROR with @@ROWCOUNT to validate the operation of an UPDATE statement. Se comprueba el valor de @@ERROR para ver si hay un error y se utiliza @@ROWCOUNT para asegurarse de que la actualización se aplica correctamente a una fila de la tabla.The value of @@ERROR is checked for any indication of an error, and @@ROWCOUNT is used to ensure that the update was successfully applied to a row in the table.

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

Ver tambiénSee Also

TRY...CATCH (Transact-SQL) TRY...CATCH (Transact-SQL)
ERROR_LINE (Transact-SQL) ERROR_LINE (Transact-SQL)
ERROR_MESSAGE (Transact-SQL) ERROR_MESSAGE (Transact-SQL)
ERROR_NUMBER (Transact-SQL) ERROR_NUMBER (Transact-SQL)
ERROR_PROCEDURE (Transact-SQL) ERROR_PROCEDURE (Transact-SQL)
ERROR_SEVERITY (Transact-SQL) ERROR_SEVERITY (Transact-SQL)
ERROR_STATE (Transact-SQL) ERROR_STATE (Transact-SQL)
@@ROWCOUNT (Transact-SQL) @@ROWCOUNT (Transact-SQL)
sys.messages (Transact-SQL) sys.messages (Transact-SQL)
Referencia de errores y eventos (Motor de base de datos)Errors and Events Reference (Database Engine)