КУРСОР SQL-сервера

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

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

Что такое курсор базы данных

Курсор базы данных — это объект, который позволяет осуществлять обход строк результирующего набора. Он позволяет обрабатывать отдельные строки, возвращаемые запросом.

Жизненный цикл курсора SQL Server

Вот шаги по использованию курсора:

Курсор SQL-сервера

Сначала объявим курсор.

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

На практике вы редко будете использовать курсор для обработки набора результатов построчно.

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

Мирослав С.

Автор статей, ИБ-специалист