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.