Пользовательские ошибки в хранимой процедуре

Большинство обсуждений в Интернете, касающихся обработки ошибок SQL Server, похоже, сосредоточены на том, как изящно обрабатывать ошибки, возникающие при обработке T-SQL, с использованием THROW или TRY...CATCH и т. д.

У меня есть хранимая процедура, которая принимает несколько параметров. Некоторые из этих параметров должны иметь значения только в определенном диапазоне, поэтому в начале моей процедуры я хочу проверить значения, которые были переданы из приложения (ASP.NET), и вернуть ошибку, если они не находятся в пределах диапазона. приемлемые границы.

На данный момент у меня есть:

IF @RequesterType <> 2 AND @RequesterType <> 3
BEGIN
    RAISERROR('The value for RequesterType must be either 2 (Client) or 3 (Representative)', 10, 1)
    RETURN;
END

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

Я знаю, что можно указать параметр серьезности оператора RAISERROR, но если я не собираюсь делать его очень высоким (я полагаю,> 19), указывающим на фатальную системную ошибку, я не думаю, что это будет иметь большое значение. .

Мне просто интересно, с тем кодом, который у меня есть, когда веб-приложение вызывает эту процедуру, оно действительно узнает, что произошла ошибка. Будет ли код VB.NET, вызывающий процедуру, знать, что произошла ошибка? Если нет, то как я могу переписать свою процедуру, чтобы она работала? Я уверен, что есть лучший способ сделать это, но в данный момент я чувствую, что пытаюсь его взломать.

Я использую SQL Server 2012.


person Philip Stratford    schedule 12.06.2014    source источник
comment
Это должно быть хорошо, если ваш уровень ошибки выше ›= 10, что приведет к исключению - см. Sharp" title="сохранение сообщения об ошибке sqlservers в c Sharp">stackoverflow.com/questions/963379/ (возможно, дубликат?)   -  person dotnetnate    schedule 12.06.2014
comment
Чтобы добавить к комментарию @dotnetnate, если у вас нет контроля над кодом VB.net, вы мало что можете сделать. Разработчик VB несет ответственность за правильную обработку исключения. Ваш процесс проверяет значения параметров и при необходимости отправляет исключение (через RAISERROR) обратно в веб-приложение. Я бы сказал, что вы сделали свою часть.   -  person Dave Mason    schedule 12.06.2014
comment
Спасибо за советы. Не совсем повторяющийся вопрос, я не думаю, так как я был уверен, что передаю сообщение об ошибке обратно в приложение, просто не уверен, что оно передается обратно как фактическая ошибка, которая потребует обработки, а не просто информация.   -  person Philip Stratford    schedule 13.06.2014


Ответы (1)


Вы должны использовать RAISERROR с уровнем безопасности 16. Согласно http://www.sommarskog.se/error-handling-I.html это значение представляет: «16 — Разная ошибка пользователя».

Пример:

PRINT 'Test #1'
RAISERROR('First bla, bla, bla', 10, 1)
PRINT 'Test #2'
RAISERROR('Second bla, bla, bla', 16, 1)

Выход:

Test #1
First bla, bla, bla
Test #2
Msg 50000, Level 16, State 1, Line 4
Second bla, bla, bla
person Bogdan Sahlean    schedule 12.06.2014
comment
Большое спасибо. Я наткнулся на эту статью и начал ее читать, но во введении упоминается, что она написана для SQL Server 2000 и что более новые версии имеют более сложную обработку ошибок, поэтому я остановился на этом и пошел дальше. Прочитайте несколько других статей, в том числе собственную статью Microsoft о RAISERROR, в которой на самом деле не перечислены различные значения серьезности и их значения. - person Philip Stratford; 13.06.2014