Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

O que é SQL Server RAISERROR?


Quando algo dá errado em seu T-SQL, você deseja corrigir o problema rapidamente com o mínimo de pesquisa e interrupção para os usuários. As mensagens de erro geradas pelo SQL Server são altamente técnicas e difíceis de entender, o que pode dificultar o isolamento de problemas e diminuir o tempo de resolução. Felizmente, os DBAs podem implementar o SQL Server RAISERROR como uma alternativa às mensagens de erro do SQL Server.

RAISERROR é uma instrução de tratamento de erros do SQL Server que gera uma mensagem de erro e inicia o processamento de erros. RAISERROR pode fazer referência a uma mensagem definida pelo usuário armazenada na exibição do catálogo sys.messages ou pode criar uma mensagem dinamicamente. A mensagem é retornada como uma mensagem de erro do servidor para o aplicativo de chamada ou para um bloco CATCH associado de uma construção TRY...CATCH.

Existem vários cenários em que é apropriado usar a instrução RAISERROR:
  • Solução de problemas de código Transact-SQL
  • Retornando mensagens que contêm texto variável
  • Examinando valores de dados
  • Quando você precisa que a execução salte de um bloco TRY para o bloco CATCH associado ou retorne informações de erro do bloco CATCH para os chamadores

É importante observar que, ao desenvolver novos aplicativos, uma instrução THROW agora é preferível a RAISERROR para tratamento de erros. Mas mais sobre isso mais tarde.

Por que usar RAISERROR para tratamento de erros do SQL Server?


Há dois motivos principais para escolher RAISERROR em vez de tratamento de erros gerado pelo SQL Server:
  1. As mensagens RAISERROR são personalizáveis ​​em relação ao nível de gravidade e estado
  2. Eles podem ser escritos em linguagem natural que seja fácil de entender

RAISERROR retorna mensagens de erro para o aplicativo no mesmo formato que é gerado pelo SQL Server Database Engine. Ele permite que os desenvolvedores gerem suas próprias mensagens de erro, para que qualquer pessoa que leia a mensagem possa entender qual é o problema real, em vez de tentar decifrar a mensagem de erro técnico do SQL Server. Os desenvolvedores também podem definir seu próprio nível de gravidade, ID de mensagem e estado para mensagens de erro.

Usando RAISERROR com a construção TRY...CATCH


TRY...CATCH é uma construção de tratamento de erros que permite executar código na seção TRY e manipular erros na seção CATCH. Em geral, TRY...CATCH é uma maneira eficaz de identificar muitos erros de T-SQL, mas há algumas exceções.

Este tutorial fornece um passo a passo detalhado de como usar RAISERROR em conjunto com TRY...CATCH. O autor usa um exemplo mostrando como usar o RAISERROR dentro de um bloco TRY para fazer com que a execução salte para o bloco CATCH associado. Dentro do bloco CATCH, o autor demonstra como utilizar o RAISERROR para retornar as informações de erro que invocou o bloco CATCH. A saída exibe o ID da mensagem, o nível de gravidade e o estado do erro.

Declarações de tratamento de erros RAISERROR vs. THROW


RAISERROR foi introduzido no SQL Server 7.0 e tem sido uma maneira eficaz de lidar com erros de T-SQL por muitos anos. Mas se você estiver desenvolvendo novos aplicativos, a Microsoft agora recomenda o uso de instruções THROW em vez de RAISERROR.

À medida que as organizações atualizam para o SQL Server 2012 e superior, o RAISERROR está sendo descontinuado. Na verdade, RAISERROR não pode ser usado em procedimentos armazenados compilados nativamente do SQL Server 2014. THROW é considerado uma melhoria em relação ao RAISERROR porque é mais fácil de usar.

A documentação do SQL Server da Microsoft detalha as diferenças entre as instruções de tratamento de erros RAISERROR e THROW da seguinte forma:

Declaração RAISERROR
  • Se um msg_id for passado para RAISERROR, o ID deverá ser definido em sys.messages.
  • O parâmetro msg_str pode conter estilos de formatação printf.

O parâmetro de gravidade especifica a gravidade da exceção.

Declaração de lance
  • O parâmetro error_number não precisa ser definido em sys.messages.
  • O parâmetro message não aceita formatação de estilo printf.
  • Não há parâmetro de gravidade. A gravidade da exceção é sempre definida como 16.

Embora os dias do RAISERROR possam estar contados, ele continua sendo uma opção viável de tratamento de erros em versões mais antigas do SQL Server. A Microsoft está pressionando os usuários de versões mais recentes do SQL Server (SQL SERVER 2012 e superior) a usar a instrução THROW em vez de RAISERROR para implementar o tratamento de erros. A Microsoft ainda não anunciou a descontinuação do RAISERROR, mas parece provável que o faça mais cedo ou mais tarde.