none
Inserir na Tabela os dados da Temporária com condição RRS feed

  • Pergunta

  • Olá pessoal preciso de uma ajuda

    Eu fiz um procedure que tem que fazer coisa:

    1º Cria um temporária
    2º Lê um txt e insere nesta tabela temporária
    3º Inseri na tabela não temporaria os valores que ainda não existirem
    4º Atualizar os registros que já existam
    5º Drop a tabela temporária

    Eu fiz o 1º, 2º e 3º itens mas não estou perdida. Vejam o codigo e me digam se conseguem ajudar.
    USE [Relatorios_Testes]  
    GO  
    /****** Object:  StoredProcedure [dbo].[sp_Usuario_Import]    Script Date: 02/27/2009 14:21:42 ******/  
    SET ANSI_NULLS ON 
    GO  
    SET QUOTED_IDENTIFIER OFF 
    GO  
       
    ALTER PROCEDURE [dbo].[sp_Usuario_Import]   
        @PathFileName varchar(100),   
    AS   
     
     --Step 1: Build Valid BULK INSERT Statement - Passo 1: Construa Válida BULK INSERT Statement   
       
    DECLARE @SQL varchar(2000)  
    Declare @linhas int 
    Declare @id_usuario int 
     
    CREATE TABLE Tmp_Usuario(   
          Id_usuario varchar (15) NOT NULL,   
          Nome varchar (50) NOT NULL,  
          Login varchar (50) NOT NULL,  
          Data_admissao datetime null,  
          Data_demissao datetime null   
    )   
     
     BEGIN 
        BULK INSERT Tmp_Usuario   
            FROM @PathFileName 
            WITH (  
                FIELDTERMINATOR = '|',  
                KEEPNULLS);  
    END 
     
        WITH Usuarios as(  
            SELECT usuario.*  
            FROM   
                tb_usuario usuario, tmp_usuario tmp  
            WHERE   
                usuario.id_usuario = tmp.id_usuario)  
     
        INSERT INTO tb_usuario(id_usuario, nome, login, data_admissao, data_demissao)  
            SELECT DISTINCT usuario.id_usuario, usuario.nome, usuario.login, usuario.data_admissao,   
                usuario.data_demissao  
                FROM tmp_usuario tmp, tb_usuario usuario  
            WHERE (tmp.id_usuario = usuario.id_usuario)  
            AND NOT EXISTS (  
                SELECT * FROM tb_usuario usuario  
                WHERE usuario.id_usuario = tmp.id_usuario  
        )  
          
        UPDATE tb_usuario  
            SET id_usuario = expression,  
                nome = ,  
                login,  
                data_admissao,  
                data_demissao  
     
     
     
          
     
    Obrigada
    sexta-feira, 27 de fevereiro de 2009 18:07

Todas as Respostas

  • Boa Noite,

    Primeiramente eu substituiria o CREATE TABLE TMP_Usuario por CREATE TABLE #TMP_Usuario. A segunda construção é uma tabela temporária de fato. Não faria muita diferença se você dropa a tabela ao final do processo, mas criar uma tabela temporária irá sobrecarregar o TEMPDB e as operações são parcialmente logadas. Criar a tabela de forma não temporária irá logar todas as atividades que além de mais lentas, ficarão presentes no log de transações aumentando o seu tamanho e a duração de um possível RESTORE. Algumas outras considerações:

    • Não entendi a criação da CTE Usuarios, uma vez que ela é definida mas não é aproveitada nos passos posteriores.
    • Considerando que você está capturando registros das tabelas de usuário e tmp_usuario e que (presumo eu) o ID do usuário é único, não vejo razão para utilizar o DISTINCT.
    • Se você o INSERT só será feito com os registros que ainda não existem, não faria sentido tentar correlacionar as tabelas com o ID usuário
    • É mais interessante atualizar primeiro e inserir depois, pois, a atualização irá contemplar menos registros

    Sua situação é uma excelente aplicação do comando MERGE disponível no SQL Server 2008, mas como creio não ser essa a sua versão do SQL Server, segue um esboço dos passos posteriores.

        UPDATE tb_usuario SET 
            nome = tmp.nome, [login] = [login],  
            data_admissao = data_admissao, data_demissao = data_demissao  
        FROM 
            tb_usuario  
            INNER JOIN Tmp_Usuario ON tb_usuario.id_usuario = tmp_usuario.id_usuario  
     
        INSERT INTO tb_usuario(id_usuario, nome, login, data_admissao, data_demissao)     
        SELECT 
            usuario.id_usuario, usuario.nome, usuario.login, usuario.data_admissao,      
            usuario.data_demissao  
        FROM tb_usuario usuario  
        WHERE 
            NOT EXISTS (SELECT * FROM tmp_usuario tmp  
                WHERE tmp.id_usuario = usuario.id_usuario) 

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com


    Classifique as respostas. O seu feedback é imprescindível
    sábado, 28 de fevereiro de 2009 01:10
  • Gustavo,

    Esse comando MERGE só está disponível na versão 2008?

    Eu utilizo a versão express... ela não possui o MERGE?

    Obrigado!

    Abs.

    _______________
    Marcio Furukawa
    sexta-feira, 13 de novembro de 2009 22:24
  • Junior,

    Poderia nos mandar a referência onde diz que é somente nessas versões que o MERGE está presente? Não consegui achar qualquer local que diga isso.


    Muito obrigado!


    Abraço!!

    Classifiquem as respostas. O Fórum agradece!!
    segunda-feira, 16 de novembro de 2009 11:00
  • Srs.

    Espero que esse link ajude http://www.microsoft.com/sqlserver/2008/en/us/editions-compare.aspx .
    MCP-MCDBA-MCAD-MCSD-MCTS-MCITP
    segunda-feira, 16 de novembro de 2009 15:08
  • Muito obrigado Rodrigo!

    Era isso que eu tava procurando. MERGE presente em Enterprise / Standard / Workgroup / Web e Express.



    Abraço!!

    Classifiquem as respostas. O Fórum agradece!!
    segunda-feira, 16 de novembro de 2009 15:40
  • Alexandre,

    Realmente o link do nosso amigo esta correto, eu sem querer acabei fazendo uma pequena confusão com outro recurso.

    Estou excluindo o post anterior.
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    segunda-feira, 16 de novembro de 2009 18:30
  • Galvão,

    Nem esquenta, isso acontece!!



    Abraço!!

    Classifiquem as respostas. O Fórum agradece!!
    segunda-feira, 16 de novembro de 2009 18:52
  • VM,


    É verdade!!!!
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    terça-feira, 17 de novembro de 2009 00:02