GO
BEGIN TRAN
INSERT INTO dbo.mytable VALUES (1)
INSERT INTO dbo.mytable VALUES (1)
INSERT INTO dbo.mytable VALUES (2)
COMMIT TRAN
GO
SELECT * FROM dbo.mytable
Можно предположить, что этот программный код оставит после себя пустую таблицу из-за ошибки в транзакции, но оказывается, что первая и третья инструкции INSERT завершаются успешно и вставляют в таблицу две строки.
Наличие в таблице двух вставленных в нее строк объясняется тем, что по умолчанию SQL Server не выполняет откат транзакции, содержащей ошибку. Если вы хотите, чтобы транзакция завершалась полностью или целиком отбрасывалась, можно выполнить команду SET для изменения параметра вашего соединения XACT_ABORT следующим образом.
Пример 2.13. |
Чтобы транзакция выполнялась полностью или целиком отбрасывалась, можно выполнить команду SETXACT_ABORTONдля изменения параметра соединения.
TRUNCATE TABLE dbo.mytable
GO
SET XACT_ABORT ON;
BEGIN TRAN
INSERT INTO dbo.mytable VALUES (1)
INSERT INTO dbo.mytable VALUES (1)
INSERT INTO dbo.mytable VALUES (2)
COMMIT TRAN
GO
SET XACT_ABORT OFF;
SELECT * FROM dbo.mytable
Несмотря на то, что с помощью инструкции SETXACT_ABORTONвы достигли цели, при изменении установочных параметров соединения можно получить непредсказуемые результаты в приложении, если в вашем программном коде параметры переустановлены некорректно. Лучшее решение — применение структурированного обработчика ошибок для отслеживания ошибки и выбора способа ее обработки.
У блока TRY...CATCH есть два компонента. Блок TRY применяется для охвата любого фрагмента кода, в котором может возникнуть ошибка, требующая отслеживания и обработки. Блок CATCH используется для обработки ошибки.
В SQL Server 2008 блок TRY...CATCH реализован следующим образом.
♦ Блок CATCH должен следовать сразу за блоком TRY.
♦ Если в блоке TRY обнаружена ошибка с уровнем серьезности менее 20, управление передается в соответствующий блок CATCH.
♦ В блоке CATCH вы можете зафиксировать текущую транзакцию или выполнить ее откат, если она не находится в состоянии, не допускающем фиксации.
♦ Инструкция RAISERROR, выполненная в блоке TRY, немедленно передает управление в блок CATCH, не возвращая в приложение сообщение об ошибке.
♦ Инструкция RAISERROR, выполненная в блоке CATCH, закрывает транзакцию, и управление передается вызывающему приложению с заданным сообщением об ошибке.
♦ Если в блоке CATCH не выполняется инструкция RAISERROR, вызывающее приложение не получит сообщение об ошибке.
Пример 2.14. |
Ниже представлен фрагмент, показывающий типичную схему обработки ошибок в программном коде с использованием обработки TRY...CATCH.
TRUNCATE TABLE dbo.mytable
GO
BEGIN TRY
BEGIN TRAN
INSERT INTO dbo.mytable VALUES (1)
INSERT INTO dbo.mytable VALUES (1)
INSERT INTO dbo.mytable VALUES (2)
COMMIT TRAN
END TRY
BEGIN CATCH
ROLLBACK TRAN
SELECT 'Ошибка! ' as 'Причина', error_number () as 'Номер ошибки', error_message () as 'Сообщение', error_severity () as 'Уровень серьезности', error_state () as 'Статус ошибки', error_line() as 'Строка', error_procedure () as 'Процедура'
END CATCH
SELECT*FROMdbo.mytable
Обратиться к хранимой процедуре можно, используя инструкцию EXEC.
Если у хранимой процедуры нет входных параметров, достаточно следующего программного кода.
EXEC <stored procedure> Если у хранимой процедуры есть входные параметры, их можно передать по именам или указав значения в нужном порядке.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.