Классика баз данных - статьи

       

Обработка ошибок в SQL


В связи с интеграцией SQL Server с платформой .NET, языки которой поддерживают гибкий механизм обработки исключений, разработчики SQL Server включили в T-SQL давно желанную SQL-программистами возможность обработки исключений. Текущая реализация в SQL Server 2005 позволяет обрабатывать некритические ошибки с помощью похожего на ставший уже стандартным синтаксис TRY … CATCH. BEGIN TRY

-- "Опасный" запрос END TRY

BEGIN CATCH

-- Обработка ошибки END CATCH

Механизм обработки ошибок в T-SQL, конечно, не такой гибкий, как в .NET языках, но, тем не менее, позволяет сделать достаточно много, анализируя код ошибки, возвращаемый функцией @@ERROR. Например, если таблица Products задана так, что не позволяет хранить отрицательное значение в колонке Quantity: CREATE TABLE [Products]( [ProductID] [int] IDENTITY(1,1) NOT NULL, [BrandID] [int] NOT NULL, [Model] [nvarchar](32) NOT NULL, [Configuration] [nvarchar](128) NOT NULL, [Price] [money] NOT NULL, [Quantity] [int] NOT NULL, CHECK ([Quantity] >= 0) )

то можно использовать следующий код для изменения количества имеющихся на складе ноутбуков и создания заказа: BEGIN TRY

BEGIN TRAN -– Создание транзакции INSERT INTO Orders([Date], ProductID, Quantity, [Year] ) VALUES(GETDATE(), @ProductID, @Quantity, @Year) SET @OrderID = @@IDENTITY

UPDATE Products2 SET Quantity = Quantity - @Quantity WHERE ProductID = @ProductID UPDATE Orders SET Quantity = @Quantity WHERE OrderID = @OrderID COMMIT –- Если нет ошибок, то подтверждаем транзакцию END TRY

BEGIN CATCH

DECLARE @Err int SET @Err = @@ERROR

ROLLBACK –- Откат транзакции IF @ERR = 547 BEGIN SELECT 'Недостаточно ноутов на складе' AS Error END

ELSE

BEGIN

SELECT 'Неизвестная ошибка' AS Error, @Err AS ErrorNumber END

END CATCH



Содержание раздела