UPSERT - Existe uma alternativa melhor para MERGE ou @@ rowcount? [fechadas]

14

Eu queria saber se você encontrou um comando T-SQL semelhante ao conceito de UPSERT? A execução de operações INSERT | UPDATE usando as opções (1) ou (2) parece excessivamente complexa e propensa a erros.

OBJETIVO

Para garantir que o registro desejado (neste caso employee_id 1) esteja atualizado, SEM ter que escrever essencialmente a mesma consulta duas vezes.

CONTEXTO

  • nome da tabela: employee
  • ID do funcionário: possui uma chave primária e o estabelecimento da identidade é definido como verdadeiro

OPÇÕES

  1. execute uma atualização SQL ... verifique @@ rowcount = 0 e @@ error = 0 ... execute SQL INSERT, se necessário

    • con: você precisa efetivamente escrever a mesma consulta duas vezes, uma vez como uma inserção, uma vez como uma atualização
    • con: more code = mais tempo digitando
    • con: mais código = mais espaço para erro

/programming/1106717/how-to-implement-a-conditional-upsert-stored-procedure "Atualizar usando @@ rowcount"

  1. executar um SQL MERGE
    • con: você precisa efetivamente escrever a mesma consulta duas vezes, uma vez como uma inserção, uma vez como uma atualização
    • con: more code = mais tempo digitando
    • con: mais código = mais espaço para erro

http://technet.microsoft.com/en-us/library/bb510625.aspx "Mesclagem de T-SQL"

  1. executar um SQL UPSERT (o recurso não existe)
    • pro: você define o relacionamento de dados para tabela uma vez (deixe o SQL Server se preocupar se é ou não um INSERT ou UPDATE)
    • pro: menos código = implementação mais rápida
    • pro: menos código = menor probabilidade

EXEMPLO UPSERT

UPSERT employeee (employee_id, employee_number, job_title, first_name, middle_name, sobrenome, modified_at) VALUES (1, '00 -124AB37 ',' Manager ',' John ',' T ',' Smith ', GetDate ());

  • se employee_id 1 não existir: MS SQL executa uma instrução INSERT
  • se employee_id 1 existir: o MS SQL executa e a instrução UPDATE
Pressacco
fonte
4
Parece uma solicitação de recurso para a Microsoft, e não algo que alguém aqui possa ajudá-lo a resolver. A solução criada pela Microsoft é MERGE. Se isso não for suficientemente flexível / poderoso para você, você precisará de uma solução diferente que ainda não existe.
Aaron Bertrand
3
Na minha opinião, MERGEé direto, flexível e também faz parte do SQL Standard. O verdadeiro problema com MERGEe outras UPSERTimplementações é a potencial escalada de bloqueios ou até deadlocks, que nada tem a ver com sintaxe.
A1ex07
Se você tiver uma pergunta, não hesite em perguntar. Como está escrito, isso é basicamente uma discussão sobre a MERGEimplementação no SQL Server.
JNK
Boa pergunta - existe essencialmente uma declaração UPSERT em que o servidor se preocupa se exige uma inserção ou atualização. Concordo que o MERGE não atende ao que você logicamente esperaria de uma implementação do "UPSERT". Dado que a MS optou por implementar dessa maneira, minha pergunta seria: o que poderia ter sido uma falha, ou impossível de implementar, se eles tivessem tentado implementar a sintaxe que você (eu e eu) gostaríamos?
Youcantryreachingme # 9/19

Respostas:

14

Eu acho que a resposta simples para isso é não. MERGEfoi a resposta da Microsoft à UPSERTlógica mais complicada . E você nem listou a pior abordagem:

IF (SELECT COUNT ... ) > 0
    UPDATE
ELSE
    INSERT

Eu vomitei na minha boca um pouco digitando isso, mas na verdade é o que eu vejo com mais frequência.

Em qualquer caso, se MERGEnão for flexível ou poderoso o suficiente para você, sugiro que você envie uma solicitação de recurso à Microsoft em http://connect.microsoft.com/sql/ e explique minuciosamente seu caso de negócios. Enquanto você se apegar às vantagens reais da sintaxe proposta MERGE, terá o meu voto. Se você se apegar muito à parte "propensa a erros", não tenho tanta probabilidade de participar. Por quê? Porque você pode digitar qualquer declaração.

Dito isto, acho que não há nada que alguém aqui possa fazer por você especificamente. Você deve investigar os possíveis problemas com MERGE:

http://www.mssqltips.com/sqlservertip/3074/use-caution-with-sql-servers-merge-statement/

Aaron Bertrand
fonte
2
Obrigado Aaron. Examinei a documentação do T-SQL no MSDN e não consegui encontrar o que estava procurando; apenas pensei em jogá-lo lá fora, caso eu perdesse alguma coisa. Embora a declaração MERGE faça sentido em determinadas situações, não posso deixar de sentir que é uma solução "marreta para pregar um prego" para uma operação simples de salvamento. Talvez eu deva pegar meu chapéu de programador e colocar meu DBA Fedora. Obrigado por compartilhar seu pensamento.
Pressacco