logo

Курсор у SQL Server

Курсор у SQL Server — це d об’єкт atabase, який дозволяє нам отримувати кожен рядок за раз і маніпулювати його даними . Курсор — це не що інше, як покажчик на рядок. Він завжди використовується в поєднанні з інструкцією SELECT. Зазвичай це колекція SQL логіка, яка проходить через задану кількість рядків один за одним. Проста ілюстрація курсору – це ситуація, коли у нас є обширна база даних записів працівників і ми хочемо обчислити зарплату кожного працівника після вирахування податків і відпусток.

SQL Server Мета курсора — оновлювати дані рядок за рядком, змінювати їх або виконувати обчислення, які неможливі, коли ми отримуємо всі записи одночасно . Це також корисно для виконання адміністративних завдань, таких як резервне копіювання бази даних SQL Server у послідовному порядку. Курсори в основному використовуються в процесах розробки, DBA та ETL.

У цій статті пояснюється все про курсор SQL Server, наприклад життєвий цикл курсору, чому і коли курсор використовується, як реалізувати курсори, його обмеження та як ми можемо замінити курсор.

Життєвий цикл курсора

Ми можемо описати життєвий цикл курсора в п'ять різних розділів наступним чином:

Курсор у SQL Server

1: Оголосити курсор

Першим кроком є ​​оголошення курсора за допомогою наведеного нижче оператора SQL:

яблучні емодзі на android
 DECLARE cursor_name CURSOR FOR select_statement; 

Ми можемо оголосити курсор, вказавши його ім’я з типом даних CURSOR після ключового слова DECLARE. Потім ми напишемо оператор SELECT, який визначає вихід для курсора.

2: відкрити курсор

Це другий крок, на якому ми відкриваємо курсор для збереження даних, отриманих із набору результатів. Ми можемо зробити це за допомогою наведеного нижче оператора SQL:

 OPEN cursor_name; 

3: Отримати курсор

Це третій крок, на якому рядки можна отримувати один за одним або в блоці, щоб виконувати маніпуляції з даними, як-от операції вставки, оновлення та видалення для поточного активного рядка в курсорі. Ми можемо зробити це за допомогою наведеного нижче оператора SQL:

 FETCH NEXT FROM cursor INTO variable_list; 

Ми також можемо використовувати Функція @@FETCHSTATUS у SQL Server, щоб отримати статус останнього курсору оператора FETCH, який було виконано проти курсору. The ОТРИМАТИ оператор був успішним, коли @@FETCHSTATUS дає нульовий результат. The WHILE Оператор можна використовувати для отримання всіх записів з курсору. Наступний код пояснює це більш чітко:

 WHILE @@FETCH_STATUS = 0 BEGIN FETCH NEXT FROM cursor_name; END; 

4: Закрийте курсор

Це четвертий крок, на якому курсор повинен бути закритий після того, як ми закінчили роботу з курсором. Ми можемо зробити це за допомогою наведеного нижче оператора SQL:

 CLOSE cursor_name; 

5: Звільнити курсор

Це п’ятий і останній крок, на якому ми зітремо визначення курсора та звільнимо всі системні ресурси, пов’язані з курсором. Ми можемо зробити це за допомогою наведеного нижче оператора SQL:

 DEALLOCATE cursor_name; 

Використання курсору SQL Server

Ми знаємо, що системи керування реляційними базами даних, включаючи SQL Server, чудово обробляють дані в наборі рядків, які називаються наборами результатів. Наприклад , у нас є стіл product_table який містить опис продукту. Якщо ми хочемо оновити ціна продукту, то нижче ' ОНОВИТИ' запит оновить усі записи, які відповідають умові в ' ДЕ' пункт:

 UPDATE product_table SET unit_price = 100 WHERE product_id = 105; 

Іноді програмі потрібно обробляти рядки в одиночному режимі, тобто рядок за рядком, а не весь набір результатів одночасно. Ми можемо виконати цей процес за допомогою курсорів у SQL Server. Перш ніж використовувати курсор, ми повинні знати, що курсори дуже погані в продуктивності, тому їх слід завжди використовувати лише тоді, коли немає жодної опції, крім курсору.

Курсор використовує ту саму техніку, що й цикли FOREACH, FOR, WHILE, DO WHILE для повторення одного об’єкта за раз у всіх мовах програмування. Отже, його можна вибрати, оскільки він застосовує ту саму логіку, що й циклічний процес мови програмування.

Типи курсорів у SQL Server

Нижче наведено різні типи курсорів у SQL Server:

  • Статичні курсори
  • Динамічні курсори
  • Курсори, спрямовані лише вперед
  • Курсори набору клавіш
Курсор у SQL Server

Статичні курсори

Набір результатів, показаний статичним курсором, завжди такий самий, як і під час першого відкриття курсору. Оскільки статичний курсор зберігатиме результат у tempdb , вони завжди лише для читання . Ми можемо використовувати статичний курсор для переміщення вперед і назад. На відміну від інших курсорів, він повільніший і споживає більше пам'яті. В результаті ми можемо використовувати його лише тоді, коли необхідна прокрутка, а інші курсори не підходять.

Цей курсор показує рядки, які було видалено з бази даних після її відкриття. Статичний курсор не представляє жодних операцій INSERT, UPDATE або DELETE (якщо тільки курсор не закрито та знову відкрито).

програма на java

Динамічні курсори

Динамічні курсори протилежні статичним курсорам, які дозволяють нам виконувати операції оновлення, видалення та вставки даних, коли курсор відкритий. Це є прокручується за замовчуванням . Він може виявити всі зміни, внесені до рядків, порядку та значень у наборі результатів, незалежно від того, чи відбуваються зміни всередині курсора чи поза ним. Поза курсором ми не можемо побачити оновлення, доки вони не будуть зафіксовані.

Курсори, спрямовані лише вперед

Це типовий і найшвидший тип курсору серед усіх курсорів. Його називають курсором лише прямого доступу, тому що він рухається лише вперед через набір результатів . Цей курсор не підтримує прокручування. Він може отримувати лише рядки від початку до кінця набору результатів. Це дозволяє нам виконувати операції вставки, оновлення та видалення. Тут видно вплив операцій вставки, оновлення та видалення, виконаних користувачем, які впливають на рядки в наборі результатів, коли рядки витягуються з курсору. Коли рядок було отримано, ми не можемо побачити зміни, внесені до рядків через курсор.

Курсори лише для прямого доступу поділяються на три типи:

  1. Forward_Only Keyset
  2. Forward_Only Static
  3. Швидко вперед
Курсор у SQL Server

Курсори, керовані набором клавіш

Ця функція курсору знаходиться між статичним і динамічним курсором щодо його здатності виявляти зміни. Він не завжди може виявити зміни в членстві набору результатів і порядку, як статичний курсор. Він може виявляти зміни в значеннях рядків набору результатів як динамічний курсор. Це може тільки перейти від першого до останнього і останнього до першого ряду . Порядок і членство фіксуються щоразу, коли відкривається цей курсор.

Він керується набором унікальних ідентифікаторів, таких же, як і ключі в наборі ключів. Набір ключів визначається всіма рядками, які кваліфікували оператор SELECT під час першого відкриття курсору. Він також може виявити будь-які зміни в джерелі даних, яке підтримує операції оновлення та видалення. За замовчуванням його можна прокручувати.

Реалізація прикладу

Давайте реалізуємо приклад курсору на сервері SQL. Ми можемо зробити це, спершу створивши таблицю з назвою ' клієнт ' використовуючи наведений нижче оператор:

 CREATE TABLE customer ( id int PRIMARY KEY, c_name nvarchar(45) NOT NULL, email nvarchar(45) NOT NULL, city nvarchar(25) NOT NULL ); 

Далі ми вставимо значення в таблицю. Ми можемо виконати наведений нижче оператор, щоб додати дані в таблицю:

 INSERT INTO customer (id, c_name, email, city) VALUES (1,'Steffen', '[email protected]', 'Texas'), (2, 'Joseph', '[email protected]', 'Alaska'), (3, 'Peter', '[email protected]', 'California'), (4,'Donald', '[email protected]', 'New York'), (5, 'Kevin', '[email protected]', 'Florida'), (6, 'Marielia', '[email protected]', 'Arizona'), (7,'Antonio', '[email protected]', 'New York'), (8, 'Diego', '[email protected]', 'California'); 

Ми можемо перевірити дані, виконавши ВИБРАТИ заява:

 SELECT * FROM customer; 

Після виконання запиту ми можемо побачити наведені нижче результати вісім рядів в таблицю:

Курсор у SQL Server

Тепер ми створимо курсор для відображення записів клієнтів. Наведені нижче фрагменти коду пояснюють усі кроки оголошення або створення курсору шляхом об’єднання всього:

Команда git push
 --Declare the variables for holding data. DECLARE @id INT, @c_name NVARCHAR(50), @city NVARCHAR(50) --Declare and set counter. DECLARE @Counter INT SET @Counter = 1 --Declare a cursor DECLARE PrintCustomers CURSOR FOR SELECT id, c_name, city FROM customer --Open cursor OPEN PrintCustomers --Fetch the record into the variables. FETCH NEXT FROM PrintCustomers INTO @id, @c_name, @city --LOOP UNTIL RECORDS ARE AVAILABLE. WHILE @@FETCH_STATUS = 0 BEGIN IF @Counter = 1 BEGIN PRINT 'id' + CHAR(9) + 'c_name' + CHAR(9) + CHAR(9) + 'city' PRINT '--------------------------' END --Print the current record PRINT CAST(@id AS NVARCHAR(10)) + CHAR(9) + @c_name + CHAR(9) + CHAR(9) + @city --Increment the counter variable SET @Counter = @Counter + 1 --Fetch the next record into the variables. FETCH NEXT FROM PrintCustomers INTO @id, @c_name, @city END --Close the cursor CLOSE PrintCustomers --Deallocate the cursor DEALLOCATE PrintCustomers 

Після виконання курсору ми отримаємо наступний результат:

Курсор у SQL Server

Обмеження SQL Server Cursor

Курсор має деякі обмеження, тому його слід завжди використовувати лише тоді, коли немає жодного параметра, окрім курсору. Ці обмеження:

  • Курсор споживає мережеві ресурси, вимагаючи проходження мережі щоразу, коли він отримує запис.
  • Курсор — це резидентний набір покажчиків, що означає, що він займає деяку пам’ять, яку інші процеси можуть використовувати на нашій машині.
  • Він накладає блокування на частину таблиці або всю таблицю під час обробки даних.
  • Продуктивність і швидкість курсору нижчі, оскільки вони оновлюють записи таблиці по одному рядку.
  • Курсори швидші, ніж цикли while, але вони мають більше витрат.
  • Кількість рядків і стовпців, які вводяться в курсор, є ще одним аспектом, який впливає на швидкість курсору. Це означає, скільки часу потрібно, щоб відкрити курсор і виконати оператор fetch.

Як ми можемо уникнути курсорів?

Основне завдання курсорів — проходити рядок за рядком таблиці. Нижче наведено найпростіший спосіб уникнути курсорів:

Використання циклу SQL while

Найпростіший спосіб уникнути використання курсору — це використати цикл while, який дозволяє вставляти набір результатів у тимчасову таблицю.

Визначені користувачем функції

Іноді курсори використовуються для обчислення результуючого набору рядків. Ми можемо досягти цього, використовуючи визначену користувачем функцію, яка відповідає вимогам.

Використання об'єднань

Join обробляє лише ті стовпці, які відповідають вказаній умові, і таким чином зменшує кількість рядків коду, що забезпечує більшу продуктивність, ніж курсори, у випадку, якщо потрібно обробити великі записи.