Exemplos:
Query utilizando cursor:
declare x cursor for select au_id, au_fname,au_lname from authors
declare @au_id varchar(20)
declare @au_fname varchar(50)
declare @au_lname varchar(50)
open x
Fetch next from x into @au_id,@au_fname,@au_lname
while @@fetch_Status=0
Begin
select @au_id,@au_fname,@au_lname
Fetch next from x into @au_id,@au_fname,@au_lname
end
close x
deallocate x
Esta mesma query pode ser reescrita utilizando-se tabelas temporárias ou funções MIN e MAX:
Tabela Temporária:
declare @au_id char( 11 )
set rowcount 0
select au_id,au_lname,au_fname into #mytemp from authors
set rowcount 1
select @au_id = au_id from #mytemp
while @@rowcount <> 0
begin
set rowcount 0
select au_id,au_lname,au_fname from #mytemp
where au_id = @au_id
delete #mytemp where au_id = @au_id
set rowcount 1
select @au_id = au_id from #mytemp
end
set rowcount 0
Função MIN:
declare @au_id char( 11 )
select @au_id = min( au_id ) from authors
while @au_id is not null
begin
select au_id,au_lname,au_fname from authors
where au_id = @au_id
select @au_id = min( au_id ) from authors
where au_id > @au_id
end
Função MAX:
declare @au_id char( 11 )
select @au_id = max( au_id ) from authors
while @au_id is not null
begin
select au_id,au_lname,au_fname from authors
where au_id = @au_id
select @au_id = max( au_id ) from authors
where au_id < @au_id
end
Os quatro algoritmos fazem o tratamento dos dados da tabela authors linha por linha. No entanto, os três últimos são bem mais rápidos do que o algorítimo que utiliza cursor.
Caso seja imprescindível a utilização de cursor, tente reduzir ao máximo o número de registros processados. Uma saída para resolver este problema é primeiro mover os registros que você precisa para uma tabela temporária e então utilizar o cursor sobre estes e não na tabela original. Quanto menor o número de registros processados, mais rápido o cursor finalizará a execução.