Инструкция TRY … CATCH в Transact-SQL обнаруживает и обрабатывает условия ошибки в приложениях базы данных. Это утверждение является краеугольным камнем обработки ошибок SQL Server и является важной частью разработки надежных приложений баз данных. TRY … CATCH применяется к SQL Server, начиная с 2008 года, базы данных Azure SQL, хранилища данных Azure SQL и хранилища параллельных данных.
Представляем TRY … CATCH
TRY … CATCH работает, позволяя вам указывать два оператора Transact-SQL: один, который вы хотите «попробовать», а другой - «улавливать» любые ошибки, которые могут возникнуть. Когда SQL Server встречает оператор TRY … CATCH, он немедленно выполняет оператор, включенный в предложение TRY. Если инструкция TRY выполняется успешно, SQL Server переходит. Однако, если инструкция TRY генерирует ошибку, SQL Server выполняет инструкцию CATCH для корректной обработки ошибки.
Основной синтаксис имеет следующий вид:
НАЧАТЬ ПОПРОБУЙТЕ блок оператора END TRYНАЧИНАЙТЕСЬsql_statementEND CATCH ; Легко понять использование этого утверждения на примере. Представьте, что вы являетесь администратором базы данных о людских ресурсах, которая содержит таблицу под названием «Сотрудники», которая содержит информацию о каждом из сотрудников вашей организации. В этой таблице используется идентификатор целочисленного сотрудника в качестве первичного ключа. Вы можете попытаться использовать приведенную ниже инструкцию, чтобы вставить нового сотрудника в вашу базу данных: INSERT INTO сотрудников (id, first_name, last_name, extension)ЦЕННОСТИ (12497, «Майк», «Чапл», 4201)
В обычных условиях это утверждение добавляет строку в таблицу Employees. Однако, если сотрудник с идентификатором 12497 уже существует в базе данных, вставка строки нарушит ограничение первичного ключа и приведет к следующей ошибке: Msg 2627, уровень 14, состояние 1, строка 1Нарушение ограничения PRIMARY KEY «PK_employee_id». Невозможно вставить дубликат ключа в объект «dbo.employees».Заявление было прекращено.
Хотя эта ошибка предоставляет вам информацию, необходимую для устранения этой проблемы, есть две проблемы. Во-первых, сообщение является загадочным. Он включает коды ошибок, номера строк и другую информацию, которая непонятна для обычного пользователя. Во-вторых, что более важно, это приводит к тому, что оператор прерывается и может привести к сбою приложения.Альтернативой является завершение заявления в инструкции TRY … CATCH, как показано ниже: НАЧАТЬ ПОПРОБУЙТЕINSERT INTO сотрудников (id, first_name, last_name, extension)ЦЕННОСТИ (12497, «Майк», «Чапл», 4201)END TRYНАЧИНАЙТЕСЬPRINT 'ERROR:' + ERROR_MESSAGE ();EXEC msdb.dbo.sp_send_dbmail@profile_name = «Почта сотрудника»,@recipients = '[email protected]',@body = 'Произошла ошибка при создании новой записи сотрудника.',@subject = 'Ошибка дублирования идентификатора сотрудника';END CATCH
В этом примере любые возникающие ошибки сообщаются как пользователю, выполняющему команду, так и адресу электронной почты [email protected]. Ошибка, отображаемая пользователю: Ошибка: Нарушение ограничения PRIMARY KEY «PK_employee_id». Невозможно вставить дубликат ключа в объект «dbo.employees».Почта в очереди.
Выполнение приложения продолжается нормально, позволяя программисту обрабатывать ошибку. Использование инструкции TRY … CATCH - это элегантный способ проактивного обнаружения и обработки ошибок, возникающих в приложениях базы данных SQL Server. Если вы хотите больше узнать о языке структурированных запросов, ознакомьтесь с «Знакомство с SQL». Пример TRY … CATCH
Узнать больше