SQL Server – Qual a diferença entre @@ERROR e ERROR_NUMBER() ?

Visualizações: 534
Tempo de Leitura: 3 minutos

Fala pessoal!
Primeiro post de 2019!

Nesse artigo, vou explicar a diferença entre @@ERROR e a função ERROR_NUMBER(), que em teoria, trazem o mesmo resultado, isto é, o número de erro causado por alguma operação na sessão atual. A ideia de escrever sobre isso, veio de uma dúvida de um Nigeriano no grupo SQL Server – DBA, do Telegram e achei que seria legal ter essa explicação publicada no meu blog para ajudar outras pessoas com a mesma dúvida.

Primeiramente, vamos consultar a documentação oficial da Microsoft para ver se temos alguma dica da diferença desses 2 métodos:

@@ERROR

Retorna o número do erro da última instrução Transact-SQL executada. Retornará 0 se a instrução Transact-SQL anterior não tiver encontrado nenhum erro.

Uma vez que @@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.

ERROR_NUMBER

Essa função retorna o número do erro que fez com que o bloco CATCH de um constructo TRY…CATCH fosse executado. Quando chamado em um bloco CATCH, ERROR_NUMBER retorna o número do erro que fez com que o bloco CATCH fosse executado. ERROR_NUMBER retorna NULL quando chamado fora do escopo de um bloco CATCH.

ERROR_NUMBER retorna um número de erro relevante, independentemente de quantas vezes ou de em que local ele é executado dentro do escopo do bloco CATCH. É diferente de uma função como @@ERROR, que retorna apenas um número de erro na instrução imediatamente após àquela que causa um erro.

Em um bloco CATCH aninhado, ERROR_NUMBER retorna o número do erro específico do escopo do bloco CATCH que referenciou esse bloco CATCH. Por exemplo, o bloco CATCH de um constructo TRY…CATCH externo poderia ter um constructo TRY…CATCH interno. Dentro desse bloco CATCH interno, ERROR_NUMBER retorna o número do erro que invocou o bloco CATCH interno. Se ERROR_NUMBER é executado no bloco CATCH externo, ele retorna o número do erro que invocou esse bloco CATCH externo.

Analisando a documentação, fica claro a diferença desses 2 métodos de identificação do código do erro:

  • @@ERROR: Retorna o código de erro da última instrução executada (a cada nova instrução, a variável é zerada). Retorna 0 se não tiver erro ou se a variável for zerada. Recomenda-se atribuir o resultado do @@ERROR a uma variável local logo no início do CATCH, pois QUALQUER COMANDO faz com que o @@ERROR seja zerado (até mesmo um SELECT @@ERROR).
  • ERROR_NUMBER: Retorna o código de erro dentro do escopo de um bloco CATCH. Retorna NULL se você tentar utilizar o comando fora de um bloco CATCH

E agora, vamos ver isso funcionando na prática!

Resultado:

Mas e se eu não estiver utilizando TRY..CATCH e quiser capturar o código do erro? Posso utilizar qualquer um dos dois métodos ?

Resposta: NÃO! Se não estiver dentro de um bloco TRY.. CATCH, a função ERROR_NUMBER() irá retornar NULL, enquanto a variável @@ERROR irá retornar o código do erro (lembre-se das condições de uso da @@ERROR para evitar que ela seja zerada e você perca essa informação).

E é isso aí, pessoal!
Post bem curtinho e objetivo e espero que tenha ajudado a esclarecer a diferença entre @@ERROR e ERROR_NUMBER().
E lembrem-se: USEM TRY…CATCH!

Um bom 2019 pra vocês e até o próximo artigo!
Grande abraço!