Inserir/Atualizar no SQL Server 2005 sem usar procedimentos armazenados

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

Eu encontrei uma pergunta anterior sobre o assunto , mas ela lida com procedimentos armazenados, que não estou usando. Gostaria de usar apenas instruções 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 minha ideia geral é esta:

If the row is found
  update
else
  insert

Quanto à verificação da existência de uma linha, quão caro é fazer uma instrução SELECT antes de chamar um UPDATE ou um INSERT? Ou é melhor tentar um UPDATE, verificar o número de linhas afetadas e, em seguida, fazer um INSERT se as linhas afetadas forem 0?

0

4 Respostas

(Antes de mais nada - eu não tentaria evitar procedimentos armazenados, se não houvesse uma razão forte. O resultado é um bom benefício na maioria dos casos).

Você pode fazer assim:

  • crie uma tabela (temporária)
  • preencha suas linhas
  • execute um INTERSECT que identifica as linhas existentes
  • atualize sua tabela com eles
  • execute um EXCEPT que identifique as novas linhas
  • executar uma inserção com esses elementos
  • soltar/limpar sua tabela (temporária)

Isso provavelmente será executado mais rapidamente se você estiver inserindo/atualizando grandes quantidades de linhas.

0
adicionado

A maneira mais eficiente é fazer o UPDATE , então faça um INSERT se @@ rowcount for zero, como explicado nesta resposta anterior .

0
adicionado
Obrigado, isso aconteceu! Essa pergunta não surgiu na minha pesquisa ...
adicionado o autor Paul Fedory, fonte

Se você está sempre indo para:
* Conte as linhas
* Inserir/Atualizar com base no resultado

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

Mesmo resultado e mais puro. Tanto quanto eu sei quando você atualiza uma linha - SQLServer faz uma exclusão/inserção de qualquer maneira (onde existe)

0
adicionado
Muitas razões. Apenas fora do topo da minha cabeça: 1) você poderia ter um gatilho que atua em DELETE que você não quer demitido neste caso. 2) Se a sua tabela usa identidades, o que provavelmente deveria, você obteria completamente novas. 3) O SQL Server não pode otimizar com facilidade.
adicionado o autor Sören Kuklau, fonte

Entenda completamente que seu post foi intitulado "SQL Server 2005", mas só queria lançar algo para olhar para frente se/quando você atualizar para o SQL 2008. A Microsoft adicionou uma nova instrução MERGE que lhe dará a capacidade de codificar uma instrução DML isso faz a atualização e a inserção. É muito legal. Eu ainda tenho que comparar desempenho e E/S, mas é ótimo ter outra ferramenta na sua caixa de ferramentas.

0
adicionado
Descobri que o SQl Management Studio 2008 tem problemas com o SQLServer 2000. Ainda não há problema se você não precisa voltar tão longe.
adicionado o autor Craig Norton, fonte
Antes do RTM de agosto, tivemos problemas na conexão com instâncias do SQL 2000, se o usuário não fosse um administrador de sistema. Felizmente, isso foi corrigido na versão RTM. Que outros problemas você viu?
adicionado o autor Eric Sabine, fonte