Skip to content

Как насчет того, чтобы TRY и CATCH некоторые транзакции?

Пересказ статьи Kevin Wilkie. How about we TRY and CATCH some Transactions?


TRY просто говорит SQL Server, что мы хотим что-то проверить. CATCH говорит SQL Server, что делать, если эта проверка не прошла.
BEGIN TRY
-- Генерируем ошибку деления на ноль
SELECT
1 / 0 AS Error;
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_STATE() AS ErrorState,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_PROCEDURE() AS ErrorProcedure,
ERROR_LINE() AS ErrorLine,
ERROR_MESSAGE() AS ErrorMessage;
END CATCH;
GO

Мы знаем - или по крайней мере должны знать - что SELECT 1/0 вызовет ошибку. В блоке CATCH будет возвращено сообщение о том, что пошло не так с кодом в блоке TRY.

Удивительно, но мы получаем следующую ошибку:



Теперь, чтобы перейти к транзакциям, мы можем создать что-то подобное следующему:

SELECT *
INTO dbo.Person4
FROM dbo.Person1
WHERE 1=0
BEGIN TRY
BEGIN TRAN
INSERT INTO dbo.Person4
(FirstName, LastName)
SELECT 'Fred', 'Flintstone'
COMMIT
END TRY
BEGIN CATCH
DECLARE @Message varchar(MAX) = ERROR_MESSAGE(),
@Severity int = ERROR_SEVERITY(),
@State smallint = ERROR_STATE()
RAISEERROR (@Message, @Severity, @State)
IF @@TRANCOUNT > 0 ROLLBACK
END CATCH

В самом верхнем операторе SELECT я просто создаю новую таблицу dbo.Person4, которая совпадает с DDL таблицы dbo.Person1.

Затем я начинаю блок TRY, а потом транзакцию. Я пытаюсь вставить некоторые данные в новую таблицу dbo.Person4. Если эта вставка вызывает ошибки, то будет выполнен переход в блок CATCH и выведено сообщение об ошибке. Если все проходит гладко, то транзакция фиксируется, и у нас все хорошо.

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

Категории: T-SQL

Обратные ссылки

Нет обратных ссылок

Комментарии

Показывать комментарии Как список | Древовидной структурой

Нет комментариев.

Автор не разрешил комментировать эту запись

Добавить комментарий

Enclosing asterisks marks text as bold (*word*), underscore are made via _word_.
Standard emoticons like :-) and ;-) are converted to images.

To prevent automated Bots from commentspamming, please enter the string you see in the image below in the appropriate input box. Your comment will only be submitted if the strings match. Please ensure that your browser supports and accepts cookies, or your comment cannot be verified correctly.
CAPTCHA

Form options

Добавленные комментарии должны будут пройти модерацию прежде, чем будут показаны.