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
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"
- 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"
- 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
fonte
MERGE
é direto, flexível e também faz parte do SQL Standard. O verdadeiro problema comMERGE
e outrasUPSERT
implementações é a potencial escalada de bloqueios ou até deadlocks, que nada tem a ver com sintaxe.MERGE
implementação no SQL Server.Respostas:
Eu acho que a resposta simples para isso é não.
MERGE
foi a resposta da Microsoft àUPSERT
lógica mais complicada . E você nem listou a pior abordagem:Eu vomitei na minha boca um pouco digitando isso, mas na verdade é o que eu vejo com mais frequência.
Em qualquer caso, se
MERGE
nã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 propostaMERGE
, 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/
fonte