Eu tenho os 2 comandos abaixo (inserir e soltar) em uma consulta. Quando executo a consulta, recebo um erro dizendo:
String ou dados binários seriam truncados.
Quando vou verificar a tabela de origem descubro que a tabela não existe. Ele foi excluído pela instrução drop. Achei que a segunda instrução não seria executada porque a primeira (a inserção) falhou.
Como posso escrever o código abaixo para que falhe toda a consulta e não elimine a tabela, a menos que a primeira parte (a inserção) seja bem-sucedida?
Preciso usar Begin, End e Go?
INSERT INTO SomeTable
SELECT * FROM SomeOtherTable
DROP table SomeOtherTable
Basicamente, você precisa testar para ver se a inserção foi bem-sucedida. Ele terá sucesso e tudo será inserido, ou falhará e nada será inserido. Verifique
@@ROWCOUNT
assim:Você pode envolvê-lo em uma transação, se quiser, ou usar um
GOTO
com um rótulo. Tudo depende de como você deseja terminar.Para obter uma lista completa de opções e considerações, consulte os artigos de referência de Erland Sommarskog:
Tratamento de erros e transações no SQL Server
Eu usaria
XACT_ABORT
setting. Isso abortará toda a transação se ocorrer algum erro.