Partilhar via


@@ERROR (Transact-SQL)

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Azure Synapse Analytics PDW (Analytics Platform System) Ponto de extremidade de análise do SQL Warehouse no Microsoft Fabric

Retorna o número do erro da última instrução Transact-SQL executada.

Convenções de sintaxe de Transact-SQL

Sintaxe

@@ERROR  

Tipos de retorno

inteiro

Comentários

Retornará 0 se a instrução Transact-SQL anterior não tiver encontrado nenhum erro.

Retornará um número de erro se a instrução anterior encontrar um erro. Se o erro for um dos encontrados na exibição de catálogo sys.messages, @@ERROR terá o valor da coluna sys.messages.message_id para esse erro. É possível exibir o texto associado a um número de erro @@ERROR em sys.messages.

Como @@ERROR é apagado e redefinido em cada instrução executada, consulte-o imediatamente após a instrução ser verificada ou salve-o em uma variável local que possa ser verificada mais tarde.

Use a construção TRY...CATCH para manipular erros. A construção TRY...CATCH também oferece suporte a funções de sistema adicionais (ERROR_LINE, ERROR_MESSAGE, ERROR_PROCEDURE, ERROR_SEVERITY e ERROR_STATE) que retornam mais informações de erro que @@ERROR. TRY...CATCH também oferece suporte a uma função ERROR_NUMBER não limitada a retornar o número de erro na instrução imediatamente após a instrução que gerou um erro. Para obter mais informações, confira TRY...CATCH (Transact-SQL).

Exemplos

a. Usando @@ERROR para detectar um erro específico

O exemplo a seguir usa @@ERROR para verificar se existe violação de restrição (erro #547) em uma instrução 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. Usando @@ERROR para sair de um procedimento condicionalmente

O exemplo seguinte usa instruções IF...ELSE para testar @@ERROR depois de uma instrução DELETE em um procedimento armazenado. O valor da variável @@ERROR determina o código de retorno enviado ao programa que está chamando, indicando o sucesso ou a falha do procedimento.

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. Usando @@ERROR com @@ROWCOUNT

O exemplo a seguir usa @@ERROR com @@ROWCOUNT para validar a operação de uma instrução UPDATE. O valor de @@ERROR é verificado para não haver indicação de erro, e @@ROWCOUNT é usado para garantir que a atualização foi aplicada com sucesso na linha da tabela.

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 Também

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)
Referência de erros e eventos (Mecanismo de Banco de Dados)