none
Problemas com Lógica (Cursor/OpenRowSet/Update) RRS feed

  • Pergunta

  • Gente,

    Estou com um problema de lógica, o caso é que tenho duas tabelas:

    Teste_Area                             Teste_Nome
    ID_Area   Nome                        Id_Nome    Nome       ID_Area

    1             DBA                           1               Tábata     2
    2             Qualidade                   2               Fulano     NULL
    3             Programador              3                Fulano1    3

    Em excel tenho a tabela na íntegra:
    Nome       Area
    Tábata      Qualidade
    Fulano
    Fulano1     Programador

    Preciso subir isso sem usar #temp, com um código mais leve possível.

    Eu sei que é fácil, mas travei total, vocês podem me ajudar?

    Fiz o seguinte:

    --' Carrega tabela area 
     INSERT INTO TESTE_AREA   
        SELECT [Area] FROM OPENROWSET('Microsoft.Jet.OleDB.4.0','EXCEL 8.0;Database=C:\Teste_Nome.XLS',Nomes$)   
        WHERE [Area] not in(SELECT nome FROM TESTE_AREA) ORDER BY [Area]  



    --Declara variaveis
    Declare @Nome varchar(150), @Area varchar(150)

    -- Zera variaveis
     Set @Nome = ''
     Set @Area = ''

    -- Inicia Cursor
    DECLARE Teste_Nome_Cursor CURSOR
    FOR
        --' Consulta os dados da tabela
        SELECT [Nome], [Area] FROM OPENROWSET('Microsoft.Jet.OleDB.4.0','EXCEL 8.0;Database=C:\Teste_Nome.XLS',Nomes$)   

     OPEN Teste_Nome_Cursor
     FETCH NEXT FROM Teste_Nome_Cursor

     --' Obtem valores
     SELECT  @Nome = [Nome],
      @Area = [Area]
     FROM OPENROWSET('Microsoft.Jet.OleDB.4.0','EXCEL 8.0;Database=C:\Teste_Nome.XLS',Nomes$)
      
     WHILE @@FETCH_STATUS = 0
     BEGIN

      UPDATE OPENROWSET('Microsoft.Jet.OleDB.4.0','EXCEL 8.0;Database=C:\Teste_Nome.XLS',Nomes$)
       SET [Area] = TA.ID_Area
       FROM OPENROWSET ('Microsoft.Jet.OleDB.4.0','EXCEL 8.0;Database=C:\Teste_Nome.XLS',Nomes$) AS S
       INNER JOIN TESTE_AREA AS TA ON (TA.NOME = S.[Area]) 
      WHERE TA.Nome = S.[Area]

     FETCH NEXT FROM Teste_Nome_Cursor
     
     END
     
     CLOSE Teste_Nome_Cursor
     DEALLOCATE Teste_Nome_Cursor


    Mas o arquivo atualiza com o id da ultima verificação.


    Muito obrigada amigos.

    quinta-feira, 10 de dezembro de 2009 21:17

Respostas

  • Bom dia tábata, vou postar um código de acordo com meu entendimento referente a sua dúvida, veja se é isso q deseja.

    -- Inseri na tabela TESTE_AREA as Area ainda não inclusas na tabela.
    INSERT INTO Teste_Area
    SELECT Ex.[Area] 
    FROM OPENROWSET('Microsoft.Jet.OleDB.4.0','EXCEL 8.0;Database=C:\Teste_Nome.XLS',Nomes$) as Ex
    WHERE NOT EXISTS(SELECT Nome FROM Teste_Area WHERE Nome = Ex.[area]) 
    ORDER BY Ex.[Area] ASC
    
    -- Select q Exibe o Id_Nome, Nome e ID_Area através de join.
    SELECT tn.[Id_Nome], tn.[Nome], ta.[ID_Area ]
    FROM 
    OPENROWSET('Microsoft.Jet.OleDB.4.0','EXCEL 8.0;Database=C:\Teste_Nome.XLS',Nomes$) as Ex
    INNER JOIN Teste_Area AS ta ON ta.[Nome] = ex.[Area]
    INNER JOIN Teste_Nome AS tn ON tn.[Nome] = ex.[Nome]
    
    
    -- Atualiza a coluna Id_Area da tabela Teste_Nome
    UPDATE tn
    SET    tn.Id_Area = ta.Id_Area
    FROM 
    OPENROWSET('Microsoft.Jet.OleDB.4.0','EXCEL 8.0;Database=C:\Teste_Nome.XLS',Nomes$) as Ex
    INNER JOIN Teste_Area AS ta ON ta.[Nome] = ex.[Area]
    INNER JOIN Teste_Nome AS tn ON tn.[Nome] = ex.[Nome]

    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino
    • Sugerido como Resposta Leonardo Marcelino sexta-feira, 11 de dezembro de 2009 16:30
    • Marcado como Resposta Tábata_000 sexta-feira, 11 de dezembro de 2009 16:36
    sexta-feira, 11 de dezembro de 2009 13:12

Todas as Respostas

  • Tábata, explique melhor o q deseja fazer, e informa a versão do seu sql server.




    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino
    sexta-feira, 11 de dezembro de 2009 00:09
  • Oi,


    Então preciso subir a tabela do excel para minha base, com o código da FK ao invés da informação.
    Preciso carregar também a tabela de relacionamento.

    O que eu tenho?  Essas duas tabelas Teste_Area ,Teste_Nome no banco.
    Onde está os dados? No excel.
    O que preciso fazer? Subir os dados, já com as informações relacionadas para essas duas tabelas do banco, sem usar tabelas temporárias.

    Eu estou usando SQL Server 2000.


    Obrigada Leonardo!

    sexta-feira, 11 de dezembro de 2009 11:53
  • Bom dia tábata, vou postar um código de acordo com meu entendimento referente a sua dúvida, veja se é isso q deseja.

    -- Inseri na tabela TESTE_AREA as Area ainda não inclusas na tabela.
    INSERT INTO Teste_Area
    SELECT Ex.[Area] 
    FROM OPENROWSET('Microsoft.Jet.OleDB.4.0','EXCEL 8.0;Database=C:\Teste_Nome.XLS',Nomes$) as Ex
    WHERE NOT EXISTS(SELECT Nome FROM Teste_Area WHERE Nome = Ex.[area]) 
    ORDER BY Ex.[Area] ASC
    
    -- Select q Exibe o Id_Nome, Nome e ID_Area através de join.
    SELECT tn.[Id_Nome], tn.[Nome], ta.[ID_Area ]
    FROM 
    OPENROWSET('Microsoft.Jet.OleDB.4.0','EXCEL 8.0;Database=C:\Teste_Nome.XLS',Nomes$) as Ex
    INNER JOIN Teste_Area AS ta ON ta.[Nome] = ex.[Area]
    INNER JOIN Teste_Nome AS tn ON tn.[Nome] = ex.[Nome]
    
    
    -- Atualiza a coluna Id_Area da tabela Teste_Nome
    UPDATE tn
    SET    tn.Id_Area = ta.Id_Area
    FROM 
    OPENROWSET('Microsoft.Jet.OleDB.4.0','EXCEL 8.0;Database=C:\Teste_Nome.XLS',Nomes$) as Ex
    INNER JOIN Teste_Area AS ta ON ta.[Nome] = ex.[Area]
    INNER JOIN Teste_Nome AS tn ON tn.[Nome] = ex.[Nome]

    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino
    • Sugerido como Resposta Leonardo Marcelino sexta-feira, 11 de dezembro de 2009 16:30
    • Marcado como Resposta Tábata_000 sexta-feira, 11 de dezembro de 2009 16:36
    sexta-feira, 11 de dezembro de 2009 13:12
  • Leandro era praticamente isso! Obrigada=D
    Só subi o restante da tabela.

    Eu estava viajando com cursor... Realmente meu problema era com lógica! Vlw.

    INSERT INTO Teste_Area
    SELECT Ex.[Area] 
    FROM OPENROWSET('Microsoft.Jet.OleDB.4.0','EXCEL 8.0;Database=C:\Teste_Nome.XLS',Nomes$) as Ex
    WHERE NOT EXISTS(SELECT Nome FROM Teste_Area WHERE Nome = Ex.[area]) AND [Area] IS NOT NULL
    ORDER BY Ex.[Area] ASC
    
    INSERT INTO Teste_Nome
    	SELECT convert(varchar(150), Ex.[Nome]), null
    	FROM OPENROWSET('Microsoft.Jet.OleDB.4.0','EXCEL 8.0;Database=C:\Teste_Nome.XLS',Nomes$) as Ex
    WHERE Ex.[Nome] IS NOT NULL
    
    -- Select q Exibe o Id_Nome, Nome e ID_Area através de join.
    SELECT tn.[Id_Nome], tn.[Nome], ta.[ID_Area ]
    FROM 
    OPENROWSET('Microsoft.Jet.OleDB.4.0','EXCEL 8.0;Database=C:\Teste_Nome.XLS',Nomes$) as Ex
    INNER JOIN Teste_Area AS ta ON ta.[Nome] = ex.[Area]
    INNER JOIN Teste_Nome AS tn ON tn.[Nome] = ex.[Nome]
    
    
    -- Atualiza a coluna Id_Area da tabela Teste_Nome
    UPDATE tn
    SET    tn.Id_Area = ta.Id_Area
    FROM 
    OPENROWSET('Microsoft.Jet.OleDB.4.0','EXCEL 8.0;Database=C:\Teste_Nome.XLS',Nomes$) as Ex
    INNER JOIN Teste_Area AS ta ON ta.[Nome] = ex.[Area]
    INNER JOIN Teste_Nome AS tn ON tn.[Nome] = ex.[Nome]    


    sexta-feira, 11 de dezembro de 2009 16:15
  • Tabata obrigado pelo retorno.  :)
    Depois se possível classifique como resposta.

    um abraço. 
    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino
    sexta-feira, 11 de dezembro de 2009 16:29