Что такое ERROR_STATE () в SQL Server и как его можно использовать?

13

Я читал, что это ERROR_STATE()может помочь различать различные состояния / места в исходном коде, где может возникать один и тот же тип ошибки. Но мне не совсем понятно, как это может быть полезно.

MSDN заявляет:

ERROR_STATE() Возвращает номер состояния ошибки, вызвавшей запуск блока CATCH конструкции TRY… CATCH.

Как это можно реально использовать? Кто-нибудь может дать мне пример, те, что приведены в этой справочной статье , на самом деле не помогают объяснить вещи для меня?

jaczjill
источник
Error_Stateи Error_Numberкомбинация даст вам более четкую картину об ошибке. Взгляните на другие функции, связанные с обработкой ошибок здесь
Ravindra Gullapalli
Спасибо! Но я прочитал эту ссылку и раньше. Это не помогло, так как на MSDN приведены не очень хорошие примеры. Вот почему я поднял вопрос здесь.

Ответы:

9

Цель состояний ошибок SQL Server состоит в том, чтобы группа разработчиков SQL Server могла идентифицировать в коде точное место возникновения системных ошибок, учитывая, что многие ошибки возникают в разных местах.

Вы, как конечный пользователь (т.е. разработчик приложений, использующих SQL Server), можете аналогичным образом использовать переданное состояние, чтобы RAISERRORслужба поддержки вашего продукта могла определить место, в котором процедура вызывает ошибку, например:

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

Посмотрите, как два состояния позволяют позже определить, в каком случае произошла ошибка. Прежде чем сказать «но я могу посмотреть на сообщение об ошибке», я говорю вам одно слово: интернационализация.

Ремус Русану
источник
Да, это то, что я искал ..! :) теперь все ясно! Спасибо!
jaczjill
очень хороший ответ. знания, полученные из вашего поста, более понятны, чем этот technet.microsoft.com/en-us/library/ms180031.aspx
kashif
6

Нет, это не поможет вам узнать, где произошла ошибка. Вот быстрый пример. Если вы попытаетесь разделить на 0, вы получите сообщение об ошибке с кучей деталей:

SELECT 1/0;

Результат:

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

Видите тот, который называется State, со значением 1? ERROR_STATE()возвращает это значение. Так что если вы используете TRY/CATCH:

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

Результат:

----
   1

Это все. Не полезно в большинстве сценариев. Я предлагаю больше прочитать об обработке ошибок в целом, прежде чем углубляться в конкретные функции, которые кажутся полезными.

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

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

Аарон Бертран
источник
Спасибо, это немного помогло. не могу проголосовать за ваш ответ, так как у меня нет необходимых привилегий. Однако я хотел выяснить причину существования этой функции на ее примере. MSDN говорит, что ERROR_STATE () возвращает номер состояния ошибки, и что мне с этим делать !!
2
@jaczjill иногда вы хотите, чтобы ваше приложение реагировало определенным образом в зависимости от error_state и сложности вашей архитектуры обработки ошибок, но я подозреваю, что обработка ошибок в целом, как это редко. Гораздо чаще встречается сам номер ошибки (перехват определенных ошибок) или серьезность ошибки. Я не помню, чтобы когда-либо видел, чтобы кто-то использовал состояние ошибки осмысленно, за исключением демонстраций, показывающих, что оно существует.
Аарон Бертран
хорошо, спасибо Аарон :) Кроме того, не могли бы вы назначить награду за этот вопрос? так что это какой-то технарь, как вызов, чтобы получить его точный ответ. Иначе ты победитель.
4
Да @AaronBertrand выставил кучу своих очков, чтобы поспорить с твоим правильным ответом.
Зейн
2
@jaczjill Не так много техников, которые знают о SQL Server больше, чем Аарон, и большинство из них никогда не появляются здесь. И здесь на ваш вопрос ответили (скорее всего, так точно, как только могли).
Дезсо
1

Краткий ответ - не может. ERROR_STATE - это подразделение ERROR_NUMBER. Он не может сказать вам, какая строка кода вызвала ошибку (кроме случаев, когда ERROR_NUMBER и ERROR_STATE вместе сообщают вам причину ошибки, и тогда становится очевидным, в чем причина).

RB.
источник
Концептуально понял, что он должен всегда использоваться с функцией ERROR_NUMBER (). Однако пример его использования ERROR_STATE () с ERROR_NUMBER () прояснит картину полностью. ИЛИ любой хорошей ссылки будет достаточно.