Eu ficaria surpreso se isso existisse, mas vou perguntar por precaução. Existe algum mecanismo que permita que uma transação afete outra transação (externa)? Por exemplo:
COMECE A TENTAR INICIAR TRAN -- Executar atualizações 01 INSERT INTO dbo.Log (Texto) VALUES ('Atualizações 01 - grande sucesso'); -- Executar atualizações 02 INSERT INTO dbo.Log (Texto) VALUES ('Atualizações 02 - grande sucesso'); -- e assim por diante... COMPROMETER-SE FIM DA TENTATIVA COMEÇAR A PESCAR REVERSÃO INSERT INTO dbo.Log (Texto) VALUES ('Em uma determinada etapa houve um problema: ' + ERROR_MESSAGE()); FINALIZAR
Obviamente, em caso de erros, perdemos as entradas de log de sucesso feitas dentro da transação e ficamos apenas com a última mensagem (erro) inserida após o rollback ter ocorrido. Existe uma maneira de tornar essas instruções INSERT INTO dbo.Log "persistentes" antes que a transação seja concluída? Acho que, se fosse, iria contra o controle de transação adequado, então, em algum nível, espero que isso não exista, mas talvez em algum lugar na categoria de truques?
Obrigada.
Supondo que eles estejam rodando na mesma sessão, não, como você já disse. Existem maneiras de contornar isso? Claro, tire-o dessa sessão colocando as mensagens em uma fila do agente de serviços com um procedimento armazenado ativado. A única parte da qual não tenho certeza é se a parte WITH LOG de raiserror estaria sujeita a isso ou não - embora você provavelmente não queira gravar os resultados no log de erros.
Também pode ser encurtado para que cada parte seja sua própria transação, mas isso pode não ser adequado às suas necessidades.