Array
(
)

update intercalado

João Arthur
|
MVP
Pontos: 700
    21 fev 2012

é o seguinte eu tenho um select assim
#Código

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 ....

Marco Pinheiro
   - 23 fev 2012

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.

João Arthur
|
MVP
Pontos: 700
    23 fev 2012

é 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....

#Código

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

João Arthur
|
MVP
Pontos: 700
    23 fev 2012

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