O que é ERROR_STATE () no SQL Server e como ele pode ser usado?


13

Eu li que ERROR_STATE()pode ajudar a distinguir entre diferentes estados / locais no código-fonte, onde o mesmo tipo de erro pode ocorrer. Mas não está realmente claro para mim como isso pode ser útil.

Estados MSDN:

ERROR_STATE() Retorna o número do estado do erro que causou a execução do bloco CATCH de uma construção TRY… CATCH.

Como pode ser realmente usado? Alguém pode me dar um exemplo, os fornecidos neste artigo de referência realmente não ajudam a explicar as coisas para mim?


Error_Statee a Error_Numbercombinação fornecerá uma imagem mais clara sobre um erro. Dê uma olhada em outras funções relacionadas ao tratamento de erros aqui
— Ravindra Gullapalli

Obrigado! Mas eu já tinha lido esse link antes. Não ajudou, pois não há bons exemplos disso no MSDN. Por isso eu levantei a pergunta aqui.

Respostas:


9

O objetivo dos estados de erro do SQL Server é que a equipe de desenvolvimento do SQL Server possa identificar no código o local exato em que os erros do sistema foram gerados, uma vez que muitos erros são gerados em vários locais.

Você como usuário final (ou seja, desenvolvedor de aplicativos usando o SQL Server) pode usar o estado transmitido de maneira semelhante RAISERRORpara que o suporte do produto possa identificar o local em que um procedimento gera um erro, por exemplo:

create procedure usp_my_proc
as
if <somecondition>
  raiserror(N'Error foo and bar', 16, 0);
if <someothercondition>
  raiserror(N'Error foo and bar', 16, 1);
go

Veja como os dois estados permitem distinguir posteriormente qual caso de erro foi atingido. Antes de você dizer 'mas posso ver a mensagem de erro', estou lhe dizendo uma palavra: internacionalização.


Sim, era isso que eu estava procurando ..! :) tudo limpo agora! Obrigado!
— jaczjill

resposta muito boa. o conhecimento obtido a partir do seu post é de compreender melhor este technet.microsoft.com/en-us/library/ms180031.aspx
— kashif

6

Não, não ajuda a descobrir nada sobre o local do erro. Aqui está um exemplo rápido. Se você tentar dividir por 0, você receberá uma mensagem de erro com vários detalhes:

SELECT 1/0;

Resultado:

Msg 8134, Level 16, State 1, Line 1
Divide by zero error encountered.

Veja o chamado State, com um valor de 1? ERROR_STATE()retorna esse valor. Então, se você usar TRY/CATCH:

BEGIN TRY
  SELECT 1/0;
END TRY
BEGIN CATCH
  SELECT ERROR_STATE();
END CATCH

Resultado:

----
   1

Isso é tudo. Não é útil na maioria dos cenários. Sugiro que você leia mais sobre o tratamento de erros em geral antes de se aprofundar em funções específicas que parecem úteis.

http://msdn.microsoft.com/en-us/library/ms175976.aspx

http://www.sommarskog.se/error_handling_2005.html


Obrigado, ajudou um pouco. Não foi possível votar na sua resposta, pois não tenho privilégios necessários. No entanto, queria entender o motivo da existência dessa função com seu exemplo. O MSDN diz que ERROR_STATE () retorna o número do estado do erro, então o que eu faço com isso !!

2
@jaczjill Às vezes, você deseja que seu aplicativo responda de uma certa maneira, dependendo do estado do erro e da complexidade de sua arquitetura de tratamento de erros, mas suspeito que lidar com erros de maneira geral seja raro. Muito mais comum com o próprio número do erro (interceptando erros específicos ) ou com a gravidade do erro. Não me lembro de ter visto alguém usar o estado de erro de maneira significativa, exceto em demos mostrando que ele existe.
— Aaron Bertrand

tudo bem, obrigado Aaron :) Além disso, você poderia definir uma recompensa para esta pergunta? para que algum técnico assuma o desafio de obter sua resposta exata. Senão você é o homem vencedor.

4
Sim, o @AaronBertrand colocou vários pontos para competir com a resposta correta.
— Zane

2
@jaczjill Não existem tantos técnicos que sabem mais sobre o SQL Server que Aaron, e a maioria deles nunca aparece aqui. E sua pergunta é respondida aqui (provavelmente o mais exatamente possível).
— Dezso

1

Resposta curta - não pode. Um ERROR_STATE é essencialmente uma subdivisão de um ERROR_NUMBER. Ele não pode dizer qual linha de código causou o erro (exceto na medida em que ERROR_NUMBER e ERROR_STATE juntos informam a causa do erro e fica óbvio qual é a causa).


Entendeu conceitualmente que ele deve ser usado sempre com a função ERROR_NUMBER (). No entanto, um exemplo de seu uso ERROR_STATE () com ERROR_NUMBER () esclarecerá a imagem completamente. OU qualquer bom link de referência será suficiente.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.