Программирование на T-SQL. Хранимые процедуры. Создание хранимых процедур. Переменные, параметры и коды возврата, страница 4

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

2.6.     Выполнение хранимых процедур

Обратиться  к хранимой процедуре можно, используя инструкцию EXEC

Если у хранимой процедуры нет входных параметров, достаточно следующего программного кода.

EXEC <stored procedure> Если у хранимой процедуры есть входные параметры, их можно передать по именам или указав значения в нужном порядке.