Какая польза от курсора в SQL Server?

Я хочу использовать курсор базы данных; Сначала мне нужно понять, каково его использование и синтаксис, и в каком сценарии мы можем использовать это в хранимых процедурах? Существуют ли разные синтаксисы для разных версий SQL Server?

Когда это необходимо использовать?

Ответ 1

Курсоры - это механизм, позволяющий явно перечислять строки из набора результатов, а не извлекать их как таковые.

Однако, хотя они могут быть более удобны в использовании для программистов, привыкших писать While Not RS.EOF Do ..., их обычно следует избегать в хранимых процедурах SQL Server, если это вообще возможно, - если вы можете написать запрос без использования курсоров, вы даете оптимизатору гораздо лучший шанс найти быстрый способ его реализации.

Честно говоря, я никогда не нашел реалистичного варианта использования для курсора, которого нельзя было избежать, за исключением нескольких административных задач, таких как циклизация всех индексов в каталоге и их восстановление. Я полагаю, что они могут использовать некоторые способы генерации отчетов или слияния почты, но, вероятно, более эффективно выполнять работу с курсором в приложении, которое ведет переговоры с базой данных, позволяя движку базы данных делать то, что он делает лучше всего - задавать манипуляции.

Ответ 2

используется курсор, потому что в подзапросе мы можем получить запись по строкам поэтому мы используем курсор для извлечения записей

Пример курсора:

DECLARE @eName varchar(50), @job varchar(50)

DECLARE MynewCursor CURSOR -- Declare cursor name

FOR
Select eName, job FROM emp where deptno =10

OPEN MynewCursor -- open the cursor

FETCH NEXT FROM MynewCursor
INTO @eName, @job

PRINT @eName + ' ' + @job -- print the name

WHILE @@FETCH_STATUS = 0

BEGIN

FETCH NEXT FROM MynewCursor 
INTO @ename, @job

PRINT @eName +' ' + @job -- print the name

END

CLOSE MynewCursor

DEALLOCATE MynewCursor

ВЫВОД:

ROHIT                           PRG  
jayesh                          PRG
Rocky                           prg
Rocky                           prg

Ответ 3

Курсор может использоваться для извлечения данных по строкам. Элементы действуют как оператор цикла (т.е. while или for loop). Чтобы использовать курсоры в процедурах SQL, вам необходимо сделать следующее: 1.Declare курсор, который определяет результирующий набор. 2.Откройте курсор, чтобы установить результирующий набор. 3. Извлеките данные в локальные переменные по мере необходимости из курсора, по одной строке за раз. 4. Закройте курсор, когда закончите.

для ex:

declare @tab table
(
Game varchar(15),
Rollno varchar(15)
)
insert into @tab values('Cricket','R11')
insert into @tab values('VollyBall','R12')

declare @game  varchar(20)
declare @Rollno varchar(20)

declare cur2 cursor for select game,rollno from @tab 

open cur2

fetch next from cur2 into @game,@rollno

WHILE   @@FETCH_STATUS = 0   
begin

print @game

print @rollno

FETCH NEXT FROM cur2 into @game,@rollno

end

close cur2

deallocate cur2

Ответ 4

Я бы сказал, что вы, возможно, захотите использовать курсор, если вы хотите сравнить характеристики, находящиеся в разных строках возвращаемого набора, или если вы хотите записать формат выходной строки, отличный от стандартного, в некоторых случаях. На ум приходят два примера:

  1. Один был в колледже, где у каждого добавления и удаления класса был свой ряд в таблице. Возможно, это был плохой дизайн, но вам нужно было сравнивать строки, чтобы узнать, сколько строк вы добавили и удалили, чтобы определить, был ли человек в классе или нет. Я не могу придумать прямой способ сделать это только с помощью sql.

  2. Другой пример - написание итоговой строки журнала для журналов GL. Вы получаете произвольное количество дебетов и кредитов в своем журнале, у вас есть много журналов в возврате набора строк, и вы хотите написать итоговую строку журнала каждый раз, когда заканчиваете журнал, чтобы опубликовать его в Главной книге. С помощью курсора вы можете определить, когда вы вышли из одного журнала и запустили другой, и у вас есть аккумуляторы для ваших дебетов и кредитов, и вывести итоговую строку журнала (или вставку таблицы), которая отличается от строки дебета/кредита.

Ответ 5

Курсор сам по себе является итератором (например, WHILE). Говоря итератор, я имею в виду способ прохождения набора записей (он же набор выбранных строк данных) и выполнение операций над ним при обходе. Операции могут быть INSERT или DELETE, например. Следовательно, вы можете использовать его для поиска данных, например. Курсор работает со строками результирующего набора последовательно - строка за строкой. Курсор может рассматриваться как указатель на одну строку в наборе строк и может ссылаться только на одну строку за раз, но при необходимости может перемещаться к другим строкам набора результатов.

Эта ссылка может иметь четкое объяснение ее синтаксиса и содержит дополнительную информацию плюс примеры.

Курсоры можно использовать и в Sprocs. Они представляют собой ярлык, позволяющий использовать один запрос для выполнения задачи вместо нескольких запросов. Тем не менее, курсоры распознают область действия и считаются неопределенными вне области действия sproc, и их операции выполняются в рамках одной процедуры. Хранимая процедура не может открыть, извлечь или закрыть курсор, который не был объявлен в процедуре.

Ответ 6

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

Работа с курсорами состоит из нескольких этапов:

Объявление - Объявление используется для определения нового курсора. Открыть - Курсор открывается и заполняется путем выполнения оператора SQL, определенного курсором. Извлечь - Когда курсор открыт, строки могут быть извлечены из курсора одна за другой. Закрыть - после операций с данными мы должны явно закрыть курсор. Deallocate - наконец, нам нужно удалить определение курсора и освободить все системные ресурсы, связанные с курсором. Синтаксис

ОБЪЯВИТЬ имя курсора CURSOR [LOCAL | GLOBAL] [FORWARD_ONLY | ПРОКРУТКА] [СТАТИЧЕСКИЙ | KEYSET | ДИНАМИЧНЫЙ | FAST_FORWARD] [READ_ONLY | SCROLL_LOCKS | ОПТИМАЛЬНЫЙ] [TYPE_WARNING] FOR select_statement [FOR UPDATE [OF column_name [,... n]]] [;]