Смекни!
smekni.com

Новые возможности T-SQL в MS SQL Server 2005 (стр. 3 из 3)

DELETE TOP(10) FROM Orders ORDER BY Date DESC

В предыдущих версиях SQL Server для использования переменной в качестве параметра оператора TOP приходилось прибегать к сложным конструкциям или динамическому созданию запроса.

DECLARE @DynamicQuery varchar(100)SET @DynamicQuery = 'SELECT TOP ' + CAST (@N AS varchar) + ' * FROM Products'EXECUTE(@DynamicQuery)

Разбиение данных на страницы с использованием оператора TOP

Наиболее простым способом использования оператора TOP для разбиения на страницы является использование смещения по колонке ID. Процедура принимает параметр – количество записей на странице и «последний» ID, полученный в предыдущем запросе. При этом, благодаря новым возможностям оператора TOP, можно варьировать количество записей на странице, используя такую простую процедуру.

SELECT TOP (@N) * FROM ИмяТаблицы WHERE КолонкаID > @ID

Более общий подход, не требующий сохранения «последнего» ID предыдущего запроса и формально не зависящий от значения ID выглядит так:

SELECT * FROM (SELECT TOP (@N * (@PageNum + 1)) * FROM ИмяТаблицыORDER BY КолонкаID) AS PTable WHERE КолонкаID NOT IN (SELECT TOP (@N * @PageNum) КолонкаID FROM ИмяТаблицыORDER BY КолонкаID)

Следует обратить внимание читателя, что запрос будет выполнять свою задачу лишь при условии того, что колонка КолонкаID содержит уникальные значения. Таким образом, для обеспечения разбиения данных с помощью такой процедуры нужно иметь в таблице колонку IDENTITY.

Для того, чтобы подобная процедура работала в более ранних версиях SQL Server, необходимо использовать динамическое создание запроса:

DECLARE @Query nvarchar(200)SET @Query = 'SELECT * FROM (SELECT TOP ' + CAST(@N * (@PageNum + 1) AS nvarchar) + ' * FROM ИмяТаблицы ORDER BY КолонкаID) AS P WHERE КолонкаID NOT IN (SELECT TOP ' + CAST(@N * @PageNum AS nvarchar) + 'КолонкаID FROM ИмяТаблицы ORDER BY КолонкаID)'EXECUTE(@Query)

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

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

BEGIN TRY -- «Опасный» запросEND TRYBEGIN 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 = @OrderIDCOMMIT –- Если нет ошибок, то подтверждаем транзакциюEND TRYBEGIN CATCH DECLARE @Err int SET @Err = @@ERROR ROLLBACK –- Откаттранзакции IF @ERR = 547BEGIN SELECT 'Недостаточно ноутов на складе' AS ErrorEND ELSE BEGIN SELECT 'Неизвестнаяошибка' AS Error, @Err AS ErrorNumberENDEND CATCH

Заключение

Пусть новые возможности Transact-SQL в SQL Server 2005 не вносят ничего принципиально нового в устройство SQL Server, но позволяют значительно быстрее создавать более понятный и легко читаемый код, упрощая, таким образом, жизнь разработчика.

В заключение, автор настоятельно рекомендует читателю ознакомиться со статьями из списка литературы, поскольку в них описаны кардинальные изменения основной концепции SQL Server.

Список литературы

Иван Бодягин, Новые возможности MS SQL Server 2004 "Yukon", RSDN Magazine #6-2003

Антон Злагостев, MS SQL Server 9 “Yukon”. Интеграция с .NET, RSDN Magazine #6-2003

Иван Бодягин, Версионность в “Yukon”, RSDN Magazine #6-2003

Иван Бодягин, MS SQL 2005: оконные функции, RSDN Magazine #6-2004

Алексей Ширшов, Использование XML совместно с SQL, RSDN Magazine #2-2004