Каков наилучший способ вернуть ошибку из TSQL Proc? - PullRequest
2 голосов
/ 11 февраля 2009

Вот сценарий:

  1. Вы загружаете страницу, которая отображается на основе данных в базе данных (назовите их «предположениями»)
  2. Кто-то меняет предположения
  3. Вы отправляете свою страницу
  4. ОШИБКА!

Общая схема решения этой проблемы такова (верно?):

В вашей процедуре сохранения внутри транзакции начала и принятия вы сначала проверяете свои предположения. Если какой-либо из них изменился, вы должны вернуть изящное сообщение об ошибке, что-то вроде XML-списка идентификаторов, с которыми у вас были проблемы, которые вы обрабатываете на странице , а не позволять обрабатывать его обработкой ошибок по умолчанию инфраструктура.

Итак, мой вопрос, каков наилучший способ сделать это?

  • Возвращать список xml и флаг ошибки в неустановленных параметрах out и 0, если он завершается правильно?
  • Использовать параметр out для возврата состояния ошибки, и результатом процедуры будет либо список ошибок, либо действительные результаты процедуры?
  • Что-то еще? (Должен заметить, что RaiseRerror может вызвать ошибку proc и получить код обработки ошибок по умолчанию)

Обновление : Я хотел бы вернуть управляемый список идентификаторов, которые не удалось (я планирую выделить эти ячейки в приложении). Я мог бы вернуть их в формате CSV в RAISEERROR, но это выглядит грязно.

Ответы [ 3 ]

4 голосов
/ 11 февраля 2009

Согласен - мне нравится RAISEERROR:

--  Validate @whatever 
IF @whatever >= '5'
BEGIN
    RAISERROR ('Invalid value for @whatever - expected a value less than 5, but received %s.', 10, 1, @whatever)
    RETURN 50000
END;
2 голосов
/ 11 февраля 2009

Используйте функцию RAISERROR с соответствующей серьезностью и / или уровнем ожидания. Если вы используете низкий уровень серьезности, это не обязательно вызывает исключение, как вы утверждаете, и с .Net, по крайней мере, довольно просто получить эти сообщения. Единственным недостатком является то, что с типом команды StoredProcedure в .Net сообщения перекачиваются только группами по 50.

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

0 голосов
/ 11 февраля 2009

Я бы сделал выходной параметр с сообщением, в возвращении уже будет что-то, что не равно 0, если возникнет ошибка

также будьте осторожны с обреченной транзакцией и проверьте с помощью xact_error, см. Используйте XACT_ABORT для отката транзакций с ошибками, которые нельзя отследить

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...