locked
loop executa uma linha a mais RRS feed

  • Pergunta

  • tenho uma tabela que possui duas linhas. e preciso usar os valores da mesma em outra operação. então estou usando um loop:

    select @id = min(id) from #temp


    while @id is not null
     begin
     
      select
       @id = id,
       @coluna1 = coluna,
      from
       #temp
      where
       id = @id
      
      
      print @id
      
      --carrego uma tabela temporária com os valores

      select @id = min(id) from #temp where id > @id
     
     
      print @id
      set @cont += 1
     
     end


    depois de executar o processo acima, vejo que na minha tabela temporária possui duas linhas. até aqui blz.

    veja que estou fazendo o print dos id's da minha tabela. quando vejo o que imprimiu está saindo assim:

    1
    2
    2

    ou seja, tem 3 linhas. e quando faço o insert está aparecendo duas vezes os mesmos registros. pq? sendo que o meu loop executa apenas duas vezes?

    sexta-feira, 21 de setembro de 2012 13:28

Todas as Respostas

  • Rafa, não entendi o objetivo desse código.

    Você tem 2 Prints...

    Tem como postar o código na íntegra?


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    sexta-feira, 21 de setembro de 2012 13:35
    Moderador
  • select id, coluna1 from tabela --me retorna dois registros

    insert into #temp
    select id,coluna from #temp1 order by 1

    select @id = min(id) from #temp

    while @cont <= @total_reg
     begin


      select
       @id = id,
       @coluna1 = coluna,
      from
       #temp
      where
       id = @id

      --faço o insert em uma tabela temporária

      
      select @id = min(id) from #temp where id > @id


     end


    o que está acontecendo é o seguinte: apesar do loop estar sendo executado duas vezes (que é o número de linhas que retorna no primeiro selec acima), está inserindo 3 registros na minha tabela temporária.
    sendo que dois deles estão identicos. ou seja, duplicados.

    queria saber pq.

    entendeu?

    sexta-feira, 21 de setembro de 2012 13:46
  • já vi qual o problema. acontece que quando faço o loop eu insero na temporária. só quando volta pro inicio do loop os resgistros do primeiro insert na temporária estão lá. então eu faço o delete na temporária, insiro nela e os dados da temporária numa tabela física. aí quando vai pra a segunda linha, eu deleto os dados da temporária e insiro novamente... e assim por diante. dessa forma não duplica. até porque minha temporária, nesse caso, serve só para a maniupulação dos dados.

    de qualquer forma valeu.

    sexta-feira, 21 de setembro de 2012 13:54
  • Rafa, mas pra que tudo isso?

    Pra que esse loop?

    Por que você não faz uma inserção direta na outra tabela?


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    sexta-feira, 21 de setembro de 2012 14:02
    Moderador
  • o loop é necessário.

    de qualquer forma obrigado.

    sexta-feira, 21 de setembro de 2012 14:18
  • Sei que vc já resolveu, mas vi seu código e só vou apontar algumas coisas:

     select
       @id = id,
       @coluna1 = coluna,
      from
       #temp
      where
       id = @id

    1) Vc não precisa da linha @id = id, pois o where já está trazendo apenas @id's iguais
    2) Esse código roda? pq tem uma vírgula a mais antes do FROM (@coluna1 = coluna,).
    3) O programa pode continuar imprimindo um resultado inesperado pq no primeiro código que postou vc tem 2 comandos PRINTs.

    sexta-feira, 21 de setembro de 2012 18:14
  • Rafa,

    Por que o loop é necessário?

    A partir do momento em que você coloca uma dúvida nos fóruns eu como Moderador preciso saber dos detalhes para poder te ajudar.

    Se você simplesmente responder obrigatório fica totalmente impossível resolver, e outro coisa a lógica que você esta utilizando não faz sentido, sendo que, num simples Select...Into você poderia criar uma nova table como os dados, ou então através de um Insert....Select inserir os dados selecionadas na tabela.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    sexta-feira, 21 de setembro de 2012 18:41
  • Roberson,

    Cara quando um post aqui nos fóruns não tiver um conteúdo que possamos entender para tentar ajudar, por gentileza não vamos responder, se possível exclua o post ou até mesmo faça o bloqueio.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    sexta-feira, 21 de setembro de 2012 18:42
  • OK Junior.

    Às vezes me dá vontade de fazer isso, mas fico sem jeito.

    Mas com a sua recomendação a coisa é diferente.

    Abs.


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    sexta-feira, 21 de setembro de 2012 20:16
    Moderador