No Oracle, existem apenas 2 tipos de cursor, ou seja, cursor implícito e explícito. O que é fácil de entender. Mas, no SQL Server, existem 4 cursores AFAIK, ou seja, estático, dinâmico, somente para frente e rolagem. O que eu sinto muito difícil de entender.
Eu tenho código apenas para frente, cursor dinâmico e estático e, exceto a declaração do cursor, tudo é o mesmo. Então, minha pergunta é, como eles são diferentes?
declare @id int
declare @ename varchar(20)
declare @cnt int
declare cur_emp cursor forward_only for select sid,ename from emp
open cur_emp
set @cnt=@@cursor_rows
while @cnt>0
begin
set @cnt=@cnt-1
print @cnt
fetch next from cur_emp into @id,@ename
print cast(@id as varchar)+' '+@ename
end
close cur_emp
deallocate cur_emp
Mesmo, o código acima não mostra nenhuma saída, exceto o(s) comando(s) concluído(s) com êxito. Mas, quando altero a declaração do cursor para estático. Então, ele está mostrando alguma saída. Por favor me ajude.
Isso é direto do SQL BOL:
No exemplo fornecido,
@@cursor_rows
retornará -1, porque seu cursor é dinâmico eWHILE
, portanto, não fará loop.@@cursor_rows
SÓ funciona com cursores estáticos.Para que o cursor acima comece a funcionar, você precisa de uma palavra-
STATIC
chave na declaração do cursor oufetch next from cur_emp into @id,@ename
antes dowhile
, e altere owhile
paraWHILE @@FETCH_STATUS = 0
Reescrito :