Estou movendo registros de um banco de dados para outro, como parte do processo de arquivamento. Quero copiar as linhas para a tabela de destino e excluir as mesmas linhas da tabela de origem.
Minha pergunta é: qual é a maneira mais eficiente de verificar se a primeira inserção foi bem-sucedida antes de excluir as linhas.
Minha idéia é essa, mas sinto que há uma maneira melhor:
@num_records=select count(ID) from Source_Table where (criteria for eligible rows)
insert * into Destination_Table where (criteria for eligible rows)
if ((select count(ID) from Destination_Table where (criteria) )=@numrecords)
delete * from Source_Table where (criteria)
É melhor / possível combiná-lo com a função RAISERROR? Obrigado!
fonte
OUTPUT
cláusula? Não é porque é tudo uma afirmação. Também evita problema de ter que ler as linhas duas vezes (e, possivelmente, perder linhas que foram adicionadas entre a leitura para a inserção e a leitura para a exclusão)A maneira como pensei em arquivar (que, com certeza, também não é perfeito), é adicionar uma coluna de bits à nova tabela de arquivamento, como 'Arquivado', que teria o valor 1 após a transferência bem-sucedida de um registro. E depois de transferir todos os registros, você pode executar uma operação de exclusão enquanto procura pelo valor do campo 'Arquivado' de '1', ou seja, Verdadeiro da tabela arquivada.
E eu concordo com Mike em usar o Try / Catch.
fonte
Tente o seguinte:
fonte