update intercalado

21/02/2012

0

é o seguinte eu tenho um select assim

select a.codEscola, count(*) as qtd from escolas a
inner join alunos b on (a.codEscola = b.CodEscola)
group by a.codEscola
order by qtd


preciso varrer o resultado deste select usando um cursor para isso, só que dentro do loop preciso pegar o codEscola e dar um update em um campo, mas preciso fazer isso da seguinte forma:
suponha que eu tenha neste select 4 registros retornados conforme ordem de campos no select acima
1 2
2 5
3 7
4 10

agora preciso pegar o primeiro registro e dar um update (1,2) em seguida preciso pular para o ultimo registro(4,10) e dar outro update em seguida volto para o segundo rgistro(2,5) depois vou para o penultimo registro (3,7) e dou um update e assim por diante ....
Joao Moreira

Joao Moreira

Responder

Posts

23/02/2012

Marco Pinheiro

Olá Joao,

A sequencia de UPDATEs deve ser essa? Primeiro, quarto, segundo e terceiro?
Demonstre como você quer com um exemplo real. Como seria este update, o que será afetado?

Att.,

Marco.
Responder

23/02/2012

Joao Moreira

é mais ou menos assim nesse loop ai preciso dar os update naquela ordem que eu citei acima
na primeira linha depois na ultima, na segunda linha depois na penultima, na terceira linha depois na antepenultima a assim vai....

declare cur_escolas cursor fast_forward for select a.estabelecimento, COUNT(*) as qtd from estabelecimento a
inner join alunos b on (a.estabelecimento = b.id_escola) --where a.VENCIMENTO is null
group by a.estabelecimento

declare @codEscola int
declare @qtd int = 0
declare @qtdInc int = 0
declare @dia int = 1
declare @sCods varchar(max) = 
declare @strSQL varchar(max) = 

open cur_escolas
fetch next from cur_escolas into @codEscola,@qtd

while (@@fetch_status != -1)
begin
  set @qtdInc = @qtdInc + @qtd
  
  set @sCods = @sCods + CONVERT(varchar(10),@codEscola) + ,
  
  if @qtdInc >= 28000
  begin
	print convert(varchar(5),@dia)
	
	set @sCods = (+@sCods+SUBSTRING(@sCods,1,LEN(@sCods)-1)+)
	
	print @sCods
	
	set @strSQL = update ESTABELECIMENTO set VENCIMENTO =  + Convert(varchar(5),@dia) +
	 where estabelecimento in  +  @sCods
	
	execute(@strSQL)
	
	set @qtdInc = 0
	set @sCods  = 
	set @dia    = @dia + 1
  end
  
  fetch next from cur_escolas into @codEscola, @qtd
end

close cur_escolas
deallocate cur_escolas
Responder

23/02/2012

Joao Moreira

ops ficou ruim...

é mais ou menos assim nesse loop ai preciso dar os update naquela ordem que eu citei acima
na primeira linha depois na ultima, na segunda linha depois na penultima, na terceira linha depois na antepenultima a assim vai....

declare cur_escolas cursor fast_forward for select a.estabelecimento, COUNT(*) as qtd from estabelecimento a
inner join alunos b on (a.estabelecimento = b.id_escola) --where a.VENCIMENTO is null
group by a.estabelecimento

declare @codEscola int
declare @qtd int = 0
declare @qtdInc int = 0
declare @dia int = 1
declare @sCods varchar(max) =
declare @strSQL varchar(max) =

open cur_escolas
fetch next from cur_escolas into @codEscola,@qtd

while (@@fetch_status != -1)
begin
set @qtdInc = @qtdInc + @qtd

set @sCods = @sCods + CONVERT(varchar(10),@codEscola) + ,

if @qtdInc >= 28000
begin
print convert(varchar(5),@dia)

set @sCods = (+@sCods+SUBSTRING(@sCods,1,LEN(@sCods)-1)+)

print @sCods

set @strSQL = update ESTABELECIMENTO set VENCIMENTO = + Convert(varchar(5),@dia) +
where estabelecimento in + @sCods

execute(@strSQL)

set @qtdInc = 0
set @sCods =
set @dia = @dia + 1
end

fetch next from cur_escolas into @codEscola, @qtd
end

close cur_escolas
deallocate cur_escolas
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar