Как насчет того, чтобы 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 и выведено сообщение об ошибке. Если все проходит гладко, то транзакция фиксируется, и у нас все хорошо.
Хотя нужно помнить о транзакциях одну важную вещь, а именно, что вы должны держать ее открытой достаточно долго, чтобы выполнить все, что вам нужно, но не дольше. Не пытайтесь делать какие-либо тяжелые вычисления. Не пытайтесь соединять множество таблиц. Просто закиньте данные в таблицу и закройте ее быстро. Поверьте мне, ваши пользователи поблагодарят вас за эту скорость.
Обратные ссылки
Автор не разрешил комментировать эту запись
Комментарии
Показывать комментарии Как список | Древовидной структурой