Использование TRY / CATCH для обработки ошибок SQL Server

Оператор TRY / CATCH в Transact-SQL обнаруживает и обрабатывает состояния ошибок в приложениях баз данных. Это утверждение является краеугольным камнем SQL Обработка ошибок сервера - важная часть разработки надежных приложений баз данных.

TRY / CATCH применяется к SQL Server, начиная с 2008 года, Базе данных SQL Azure, Хранилищу данных SQL Azure и Хранилищу параллельных данных.

Представляем TRY / CATCH

TRY./CATCH работает, определяя два оператора Transact-SQL: один, который вы хотите «попробовать», а другой использовать для «отлова» любых возможных ошибок. Когда SQL Server встречает инструкцию TRY / CATCH, он немедленно выполняет инструкцию, включенную в предложение TRY. Если инструкция TRY выполняется успешно, SQL Server продолжает работу. Однако, если инструкция TRY вызывает ошибку, SQL Server выполняет инструкцию CATCH для корректной обработки ошибки.

Основной синтаксис имеет такую ​​форму:

НАЧАТЬ ПОПРОБОВАТЬ
{sql_statement | блок операторов}
КОНЕЦ ПОПЫТКИ
НАЧАТЬ ЛОВ
[{sql_statement | statement_block}]
КОНЕЦ ЗАХВАТ
[; ]
instagram viewer

Пример TRY / CATCH

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

Вы можете попытаться использовать приведенный ниже оператор, чтобы вставить нового сотрудника в свою базу данных:

ВСТАВИТЬ сотрудников (id, first_name, last_name, extension)
ЦЕННОСТИ (12497, «Майк», «Чаппл», 4201)

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

Msg 2627, уровень 14, состояние 1, строка 1
Нарушение ограничения PRIMARY KEY PK_employee_id. Невозможно вставить повторяющийся ключ в объект dbo.employees.
Заявление было прекращено.

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

Альтернативный вариант - заключить этот оператор в оператор TRY… CATCH, как показано здесь:

НАЧАТЬ ПОПРОБОВАТЬ
ВСТАВИТЬ сотрудников (id, first_name, last_name, extension)
ЦЕННОСТИ (12497, «Майк», «Чаппл», 4201)
КОНЕЦ ПОПЫТКИ
НАЧАТЬ ЛОВ
ПЕЧАТЬ 'ОШИБКА:' + ERROR_MESSAGE ();
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'Почта сотрудника',
@recipients = '[email protected]',
@body = 'Произошла ошибка при создании новой записи о сотруднике.',
@subject = 'Ошибка базы данных сотрудников';
КОНЕЦ ЗАХВАТ

В этом примере обо всех возникающих ошибках сообщается как пользователю, выполняющему команду, так и на адрес электронной почты [email protected]. Пользователь видит следующую ошибку:

Ошибка: нарушение ограничения PRIMARY KEY "PK_employee_id". 
Невозможно вставить повторяющийся ключ в объект dbo.employees.
Почта в очереди.

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

Узнать больше

Чтобы узнать больше о языке структурированных запросов, ознакомьтесь с нашей статьей Основы SQL.

instagram story viewer