Когато нещо се обърка във вашия T-SQL, искате да отстраните проблема бързо с минимално ровене и прекъсване на потребителите. Съобщенията за грешки, генерирани от SQL Server, са силно технически и трудни за разбиране, което може да затрудни изолирането на проблеми и може да забави времето за разрешаване. За щастие администраторите на база данни могат да внедрят SQL Server RAISERROR като алтернатива на съобщенията за грешки в SQL Server.
RAISERROR е оператор за обработка на грешки на SQL Server, който генерира съобщение за грешка и инициира обработка на грешка. RAISERROR може или да препраща към дефинирано от потребителя съобщение, което се съхранява в каталожния изглед на sys.messages, или може да изгради съобщение динамично. Съобщението се връща като съобщение за грешка на сървъра към извикващото приложение или към свързан блок CATCH на конструкция TRY...CATCH.
Има няколко сценария, в които е подходящо да използвате израза RAISERROR:
- Отстраняване на неизправности с Transact-SQL код
- Връщане на съобщения, които съдържат променлив текст
- Проверка на стойностите на данните
- Когато имате нужда от изпълнението, за да прескочите от TRY блок към свързания блок CATCH или да върнете информация за грешка от блока CATCH на повикващите
Важно е да се отбележи, че при разработването на нови приложения операторът THROW вече е за предпочитане пред RAISERROR за обработка на грешки. Но повече за това по-късно.
Защо да използвате RAISERROR за обработка на грешки в SQL Server?
Има две основни причини за избора на RAISERROR пред обработката на грешки, генерирани от SQL Server:
- Съобщенията RAISERROR могат да се персонализират по отношение на нивото на сериозност и състоянието
- Могат да бъдат написани на естествен език, който е лесен за разбиране
RAISERROR връща съобщения за грешка към приложението в същия формат, който се генерира от SQL Server Database Engine. Той позволява на разработчиците да генерират свои собствени съобщения за грешка, така че всеки, който чете съобщението, ще може да разбере какъв е действителният проблем, вместо да се опитва да дешифрира съобщението за техническа грешка на SQL Server. Разработчиците могат също да задават свое собствено ниво на сериозност, идентификатор на съобщението и състояние за съобщения за грешка.
Използване на RAISERROR с конструкцията TRY...CATCH
TRY...CATCH е конструкция за обработка на грешки, която ви позволява да изпълнявате код в секцията TRY и да обработвате грешки в секцията CATCH. Като цяло TRY...CATCH е ефективен начин за идентифициране на много T-SQL грешки, но има няколко изключения.
Този урок предоставя подробно описание как да използвате RAISERROR във връзка с TRY...CATCH. Авторът използва пример, показващ как да се използва RAISERROR вътре в TRY блок, за да накара изпълнението да прескочи към свързания блок CATCH. Вътре в блока CATCH авторът демонстрира как да се използва RAISERROR за връщане на информацията за грешката, която е извикала блока CATCH. Резултатът показва идентификатора на съобщението, нивото на сериозност и състоянието на грешката.
Изявления за обработка на грешки RAISERROR срещу THROW
RAISERROR е въведен в SQL Server 7.0 и е ефективен начин за справяне с T-SQL грешки в продължение на много години. Но ако разработвате нови приложения, Microsoft вече препоръчва използването на изрази THROW вместо RAISERROR.
Тъй като организациите актуализират до SQL Server 2012 и по-нова версия, RAISERROR постепенно се премахва. Всъщност RAISERROR не може да се използва в компилираните на SQL Server 2014 съхранени процедури. THROW се счита за подобрение спрямо RAISERROR, защото е по-лесен за използване.
Документацията на Microsoft SQL Server разбива разликите между операторите за обработка на грешки RAISERROR и THROW, както следва:
Изявление RAISERROR
- Ако msg_id се предава на RAISERROR, идентификаторът трябва да бъде дефиниран в sys.messages.
- Параметърът msg_str може да съдържа стилове за форматиране printf.
Параметърът за сериозност определя сериозността на изключението.
THROW изявление
- Параметърът error_number не трябва да бъде дефиниран в sys.messages.
- Параметърът на съобщението не приема форматиране в стил printf.
- Няма параметър за сериозност. Тежестта на изключението винаги е настроена на 16.
Въпреки че дните на RAISERROR може да са преброени, той остава жизнеспособна опция за обработка на грешки в по-стари версии на SQL Server. Microsoft принуждава потребителите на по-нови версии на SQL Server (SQL SERVER 2012 и по-нови) да използват израза THROW вместо RAISERROR за внедряване на обработка на грешки. Microsoft все още не е обявила оттеглянето на RAISERROR, но изглежда вероятно това да стане рано или късно.