none
INSERT ou UPDATE table de forma dinâmica RRS feed

  • Pergunta

  • Imaginem duas tabelas idênticas (campos), vamos supor algo simples: CNPJ, NF, ITEM, VALOR_NF e VALOR_ICMS (inventei agora, rsrs). Considerar que CNPJ+NF+ITEM é chave!

    A primeira tabela é a "quente", digamos NOTAS e a segunda contém registros a serem incluídos ou atualizados na primeira, digamos NOTAS_CARGA.

    Ocorre que nesta última, posso ter tanto registros novos quanto duplicados em relação a primeira, então preciso de um SCRIPT para UPDATE ou INSERT conforme a ocorrência de duplicidade ou não ... isso é simples ??

    quinta-feira, 12 de setembro de 2019 19:15

Respostas

  • Ocorre que nesta última, posso ter tanto registros novos quanto duplicados em relação a primeira, então preciso de um SCRIPT para UPDATE ou INSERT conforme a ocorrência de duplicidade ou não ... isso é simples ??

    O que você solicita é o UPSERT. No SQL Server pode ser simulado utilizando UPDATE e a seguir INSERT :

    -- código #1
    BEGIN TRANSACTION;

    UPDATE T1 set ... from Tabela1 as T1 inner join Tabela2 as T2 on T2.chave = T1.chave; INSERT into Tabela1 (colunas) SELECT colunas from Tabela2 as T2 where not exists (SELECT * from Tabela1 as T where T.chave = T2.chave);

    COMMIT;

     

    Ou então, como sugerido por "gapimex", usando o MERGE

    -- código #2 v2
    MERGE
    into Tabela1 with (holdlock) as T1
    using Tabela2 as T2
    on T1.chave = T2.chave
    when matched
    then UPDATE set ...
    when not matched by target
    then INSERT (colunas) values (colunas);



    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Marcado como Resposta MLRamos sexta-feira, 13 de setembro de 2019 16:05
    • Editado José Diz segunda-feira, 7 de outubro de 2019 00:15
    sexta-feira, 13 de setembro de 2019 00:59

Todas as Respostas