В этом руководстве вы узнаете, как использовать курсор SQL Server для обработки набора результатов, по одной строке за раз.
SQL работает на основе набора, например, оператор SELECT возвращает набор строк, который называется результирующим набором. Однако иногда вам может понадобиться обработать набор данных построчно. Вот тут-то и вступают в игру курсоры.
Что такое курсор базы данных
Курсор базы данных — это объект, который позволяет осуществлять обход строк результирующего набора. Он позволяет обрабатывать отдельные строки, возвращаемые запросом.
Жизненный цикл курсора SQL Server
Вот шаги по использованию курсора:
Сначала объявим курсор.
DECLARE cursor_name CURSOR FOR select_statement;
Чтобы объявить курсор, необходимо указать его имя после ключевого слова DECLARE с типом данных CURSOR и предоставить оператор SELECT, который определяет результирующий набор для курсора.
Затем откройте и заполните курсор, выполнив оператор SELECT:
OPEN cursor_name;
Затем извлеките строку из курсора в одну или несколько переменных :
FETCH NEXT FROM cursor INTO variable_list;
SQL Server предоставляет функцию @@FETCHSTATUS, которая возвращает статус последнего оператора FETCH курсора, выполненного для курсора; Если @@FETCHSTATUS возвращает 0, это означает, что оператор FETCH был успешным. Вы можете использовать оператор WHILE для извлечения всех строк из курсора, как показано в следующем коде:
WHILE @@FETCH_STATUS = 0 BEGIN FETCH NEXT FROM cursor_name; END;
После этого закройте курсор:
CLOSE cursor_name;
Наконец, освободите курсор:
DEALLOCATE cursor_name;
Пример курсора SQL Server
Мы воспользуемся таблицей prodution.products из примера базы данных, чтобы показать вам, как использовать курсор:
Сначала объявите две переменные для хранения названия продукта и цены по прейскуранту, а также курсор для хранения результата запроса, который извлекает название продукта и цену по прейскуранту из таблицы production.products:
DECLARE @product_name VARCHAR(MAX), @list_price DECIMAL; DECLARE cursor_product CURSOR FOR SELECT product_name, list_price FROM production.products;
Далее откройте курсор:
OPEN cursor_product;
Затем извлеките каждую строку из курсора и выведите название продукта и цену по прейскуранту:
FETCH NEXT FROM cursor_product INTO @product_name, @list_price; WHILE @@FETCH_STATUS = 0 BEGIN PRINT @product_name + CAST(@list_price AS varchar); FETCH NEXT FROM cursor_product INTO @product_name, @list_price; END;
После этого закройте курсор:
CLOSE cursor_product;
Наконец, отмените выделение курсора, чтобы освободить его.
DEALLOCATE cursor_product;
Следующие фрагменты кода объединяют все воедино:
DECLARE @product_name VARCHAR(MAX), @list_price DECIMAL; DECLARE cursor_product CURSOR FOR SELECT product_name, list_price FROM production.products; OPEN cursor_product; FETCH NEXT FROM cursor_product INTO @product_name, @list_price; WHILE @@FETCH_STATUS = 0 BEGIN PRINT @product_name + CAST(@list_price AS varchar); FETCH NEXT FROM cursor_product INTO @product_name, @list_price; END; CLOSE cursor_product; DEALLOCATE cursor_product;
Вот частичный вывод:
На практике вы редко будете использовать курсор для обработки набора результатов построчно.
В этом руководстве вы узнали, как использовать курсор SQL Server для обработки набора результатов, построчно.