Compartir vía


@@ERROR (Transact-SQL)

Se aplica a: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Punto de conexión de análisis SQL en Microsoft Fabric Almacenamiento en Microsoft Fabric

Devuelve el número de error de la última instrucción Transact-SQL ejecutada.

Convenciones de sintaxis de Transact-SQL

Sintaxis

@@ERROR  

Tipos de valor devuelto

integer

Comentarios

Devuelve 0 si la instrucción Transact-SQL anterior no encontró errores.

Devuelve un número de error si la instrucción anterior encontró un 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 column para dicho error. Puede ver el texto asociado con el número de error @@ERROR en 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.

Use la construcción TRY...CATCH para controlar errores. 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. 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. Para obtener más información, vea TRY...CATCH (Transact-SQL).

Ejemplos

A. Utilizar @@ERROR para detectar un error específico

En el ejemplo siguiente se utiliza @@ERROR para comprobar si se infringe una restricción CHECK (error nº 547) en una instrucción 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. Utilizar @@ERROR para salir condicionalmente de un procedimiento

En el ejemplo siguiente se utilizan las instrucciones IF...ELSE para probar @@ERROR después de una instrucción DELETE en un procedimiento almacenado. 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.

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. Utilizar @@ERROR con @@ROWCOUNT

En el ejemplo siguiente se utiliza @@ERROR con @@ROWCOUNT para validar la operación de una instrucción UPDATE. 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.

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  

Consulte también

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)
Referencia de errores y eventos del motor de base de datos