Какая польза от курсора в SQL Server? - PullRequest
26 голосов
/ 19 ноября 2010

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

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

Ответы [ 6 ]

38 голосов
/ 19 ноября 2010

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

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

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

16 голосов
/ 11 декабря 2012

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

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

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
8 голосов
/ 04 октября 2012

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

для примера:

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
1 голос
/ 27 июля 2018

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

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

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

1 голос
/ 20 января 2018

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

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

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

0 голосов
/ 15 июня 2019

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

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

Declare - Объявление используется для определения нового курсора.Открыть - Курсор открывается и заполняется путем выполнения оператора 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]]] [;]

...