Що таке ERROR_STATE () у SQL Server і як ним можна користуватися?


13

Я читав, що ERROR_STATE()може допомогти розрізнити різні стани / локації у вихідному коді, де можуть виникати однакові помилки. Але мені не зовсім зрозуміло, як це може бути корисним.

MSDN заявляє:

ERROR_STATE() Повертає номер стану помилки, яка спричинила запуск блоку CATCH конструкції TRY… CATCH.

Як це можна реально використовувати? Чи може хтось надати мені приклад? Наведені в цій довідковій статті насправді не допомагають мені добре пояснити речі?


Error_Stateі Error_Numberкомбінація дасть вам більш чітку картину про помилку. Подивіться на інші функції , пов'язані з обробки помилок тут
Равіндра 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, ніж Aaron, і більшість з них ніколи тут не з’являється. І на ваше запитання тут відповіли (швидше за все, саме так, як це могло йти).
dezso

1

Коротка відповідь - не може. ERROR_STATE по суті є підрозділом ERROR_NUMBER. Він не може сказати вам, який рядок коду спричинив помилку (за винятком випадків, коли ERROR_NUMBER та ERROR_STATE разом повідомляють про причину помилки, і тоді стане очевидно, в чому причина).


Зрозумів концептуально, що його потрібно використовувати з функцією ERROR_NUMBER () завжди. Однак приклад його використання ERROR_STATE () з ERROR_NUMBER () повністю прояснить малюнок. АБО будь-якого хорошого посилання буде достатньо.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.