Обработка ошибок в 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