none
Atualizar Registros RRS feed

  • Pergunta

  • Amigos, bom dia

    Programo em Delphi com SQL e tenho uma pequena tarefa, q usando delphi resolvo fácil, porem gostaria de avançar mais no SQL.
    Tenho uma tabela e preciso atualizar outra com um campo desta tabela.
    No delphi eu faço um select, depois um while e ta resolvido, no SQL consigo fazer isso, porem não tenho muita pratica.

    exemplo

    select salario from registrooag

    while not query.eof do begin
      update no salario da tabela funcionario
      passando o parametro do select de cima
      next;
    end;


    valeu amigos...
    quarta-feira, 20 de agosto de 2008 14:12

Todas as Respostas

  • LRodrigues,

     

    No SQL Server também poderá utilizar While, como também trabalhar com Cursor, veja abaixo um exemplo que utiliza as duas técnicas, sendo que todo processo de loop utilizado no SQL Server gera um custo de processamento alto, principalmente se utilizar o Cursor.

     

    Code Snippet

    Drop Table NovoUsuario

     

    create table novousuario
     (
      codigo int identity(1,1),
      descricao varchar(10),
      data datetime,
      senha char(10))

     

    Insert Into NovoUsuario values('junior',getdate(),'')
    Insert Into NovoUsuario values('edu',getdate()-300,'')
    Insert Into NovoUsuario values('joão',getdate()-200,'')
    Insert Into NovoUsuario values('pedro',getdate()-100,'')
    Insert Into NovoUsuario values('fer',getdate()-10,'')

     

    Select * from NovoUsuario

     

    Declare @Codigo Int

    Set @Codigo=1

     

    While @Codigo <= (Select Count(Codigo) from NovoUsuario)
     Begin
      Select @Codigo=(Select Codigo from NovoUsuario Where codigo = @Codigo)

      Update NovoUsuario
      Set Senha=Convert(Char(10),Data ,103)
      Where Codigo = @Codigo

      Set @Codigo=@Codigo + 1
     End

     

    Code Snippet

     

    ALTER Procedure [dbo].[P_RegistroHistorico] @NUMMO Char(7)
    As
     Begin

      Set NoCount On

      Declare @NumControle Char(7),
                 @Contador Int,
                 @CodSequencialProduto Int,
                 @CodRelacionamento Int

      Set @NumControle = 0
      Set @Contador = 0
      Set @CodSequencialProduto = 0
      Set @CodRelacionamento = 0

      Truncate Table ResumoResultadosMO

      Select @Contador=Count(*) From CTProducao_Moinho_Items
      Where NUMMO=@NUMMO
      AND    CODSIGLA='MO'

      Declare CTProducao_Moinho_Items_MO_Cursor Cursor For
      Select NUMCONTROLE from CTProducao_Moinho_Items
      Where NUMMO = @NUMMO
      AND    CODSIGLA= 'MO'
      Open CTProducao_Moinho_Items_MO_Cursor

      While @Contador > 0
       Begin
        Fetch Next From CTProducao_Moinho_Items_MO_Cursor
        Into @NumControle

        If (SubString(@NumControle,6,2)='07')
         Begin
         
          Select @CodRelacionamento=CodRelacionamento,
                   @CodSequencialProduto=CodSequencialProduto
          From CTProducao_Moinho_Resultados Where NUMMO = @NumControle                

          Insert Into ResumoResultadosMO
          SELECT 'MO',
                     PQCRe.NUMMO,
                     ME.DESCRICAO,
                     CME.CLASSE+' - '+CONVERT(VARCHAR(4),ME.NUMENSAIO) As "CodClasses",
                     DataEntrada=(Select DataEntrada from CTProducao_Moinho_Info_Reprovacao Where NUMMO = PQCRe.NUMMO And NumRetorno = PQCRe.NUMRETORNO),                
                     DataLiberacao=(Select DataLiberacao from CTProducao_Moinho_Info_Reprovacao Where NUMMO = PQCRe.NUMMO And NumRetorno = PQCRe.NUMRETORNO),
                     PQCRe.NUMRETORNO,
                     PQCx.PADRAO_MINIMO,
                     PQCx.PADRAO_MAXIMO,
                     ME.UNIDADE,
                     PQCRe.AMOSTRA,
                     Case PQCRe.STATUS
                      When 'A' Then 'Aprovado'
                      When 'R' Then 'Reprovado'
                     End As Status,
                     PQCRe.MOTIVO_ANALISE,
                     NOME=(SELECT NOME FROM RESPONSAVEL Where Responsavel.Codigo = PQCRe.CodResponsavel_Laboratorio)
          FROM METODOS_ENSAIOS ME INNER JOIN CLASSIFICACAO_ME CME
                                                    ON ME.NUMCLASSE = CME.CODIGO
                                                   INNER JOIN PQC_MoinhoxME PQCx
                                                    ON PQCx.CODSEQUENCIALMETODO = ME.CODIGO
                                                   INNER JOIN CTPRODUCAO_MOINHO_RESULTADOS PQCRe
                                                    ON PQCRe.NUMMO = @NumControle
                                                    AND PQCRe.CODSEQUENCIALMETODO = ME.CODIGO
          WHERE PQCx.CODSEQUENCIALPRODUTO = @CodSequencialProduto
          AND     PQCx.CODRELACIONAMENTO = @CodRelacionamento

         End

        Set @Contador= @Contador -1
       End


      Select NumControle, Descricao, CodClasses, DataEntrada, DataLiberacao, NumRetorno,
                PadraoMinimo, PadraoMaximo, Unidade, Amostra, Status, MotivoAnalise, NomeResponsavel From ResumoResultadosMO
      Order By CodSigla Desc, NumControle Asc

      CLOSE CTProducao_Moinho_Items_MO_Cursor
      DEALLOCATE CTProducao_Moinho_Items_MO_Cursor
     End

     

     


     

    quarta-feira, 20 de agosto de 2008 14:24
  • Boa Tarde,

     

    Utilizar esse tipo de construção em Loop seja pelo TSQL ou pelo Delphi é um rotina bastante ineficiente. Se a idéia é fazer um UPDATE cruzado, ou seja, atualizar dados de uma tabela com base em outra, use uma única instrução. Ex:

     

    Code Snippet

    -- Com base em duas tabelas

    UPDATE Tabela1 SET

    Campo1 = Tabela2.Campo1,

    Campo2 = Tabela2.Campo2

    FROM Tabela1

    INNER JOIN Tabela2 ON Tabela1.Chave = Tabela2.Chave

     

    -- Com base em uma tabela e uma Query

    UPDATE Tabela1 SET

    Campo1 = Tabela2.Campo1,

    Campo2 = Tabela2.Campo2

    FROM Tabela1

    INNER JOIN (<Seu SELECT>) AS Tabela2 ON Tabela1.Chave = Tabela2.Chave

     

     

    [ ]s,

     

    Gustavo

    quarta-feira, 20 de agosto de 2008 19:20