Pergunta

Eu estou tentando fazer o cenário clássico Insert / Update onde eu preciso atualizar linhas existentes em um banco de dados ou inseri-los se eles não estão lá.

Eu encontrei um pergunta anterior sobre o assunto , mas trata-se de procedimentos armazenados, o que eu não estou usando. Eu gostaria de usar apenas declarações claras SQL SELECT, INSERT e UPDATE, a menos que haja algo melhor disponível (a instrução MERGE não está disponível no SQL Server 2005).

Eu acho que a minha ideia geral é a seguinte:

If the row is found
  update
else
  insert

Como para a verificação de existência de uma linha, o quão caro é fazer uma instrução SELECT antes de chamar um UPDATE ou um INSERT? Ou é melhor apenas tentar um UPDATE, verifique o número de linhas afetadas, e depois fazer um INSERT se as linhas afetadas é 0?

Foi útil?

Solução

A maneira mais eficiente é fazer a UPDATE, em seguida, fazer uma INSERT se @@rowcount é zero, conforme explicado nesta resposta anterior.

Outras dicas

(Primeiro de tudo -.. Eu não tentar evitar procedimentos armazenados, se não há nenhuma razão forte A dar uma boa vantagem na maioria dos casos)

Você poderia fazê-lo desta maneira:

  • criar uma tabela (temporária)
  • preenchimento em suas linhas
  • executar um INTERSECT que identifica as linhas extisting
  • atualizar sua mesa com eles
  • executar um EXCETO que identifica as novas linhas
  • executar uma inserção com esses elementos
  • Queda / limpar sua mesa (temporária)

Isto irá provavelmente funcionar mais rapidamente, se você está inserindo / atualização de grandes quantidades de linhas.

Completamente entender que o seu post foi intitulado "SQL Server 2005", mas só queria jogar fora algo para olhar para a frente para se / quando você atualizar para SQL 2008. A Microsoft adicionou uma nova instrução MERGE que lhe dará a capacidade de código uma instrução DML que faz tanto a atualização e inserção. É muito legal. Eu ainda tenho que comparar o desempenho e I / Os, mas é apenas bom ter mais uma ferramenta em sua caixa de ferramentas.

Se você está sempre indo para:
* Contagem as linhas
* Insert / Update com base no resultado

Por que não em vez disso:
* Excluir linha
* Inserir linha

Mesmo resultado e mais puro.
Tanto quanto eu sei quando você atualizar uma linha - SQLServer faz um Eliminar / Inserir qualquer maneira (onde existe)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top