SQL Server XACT_ABORT com exclusão
Eu tenho um procedimento armazenado maior que utiliza vários blocos TRY / CATCH para capturar e registrar erros individuais. Também envolvi uma transação em todo o conteúdo do procedimento, para poder reverter a coisa toda no caso de um erro gerado em algum lugar ao longo do caminho (a fim de evitar muita limpeza bagunçada); XACT_ABORT foi ativado, pois caso contrário não reverteria a transação inteira.
Componente chave:
Há uma tabela no meu banco de dados que obtém um registro inserido toda vez que esse procedimento é executado com os resultados das operações e detalhes sobre o que deu errado.
O engraçado está acontecendo - na verdade, quando eu finalmente descobri o que estava errado, era bastante óbvio ... a instrução de inserção na minha tabela de log também está sendo revertida, portanto, se eu não estiver executando o SSMS, Não poderei ver que isso foi executado, pois a reversão remove todos os transes de atividade.
Pergunta, questão:
Seria possível reverter toda a transação, com exceção dessa instrução de inserção única? Eu ainda gostaria de preservar a mensagem de erro que compilo durante a execução do procedimento armazenado.
Muito obrigado!
~ Eli
Atualização 6/28
Aqui está um exemplo de código do que estou vendo. A principal diferença entre isso e os exemplos apresentados por @Alex e @gameiswar é que, no meu caso, os blocos try / catch estão todos aninhados dentro da transação única. O objetivo disso é ter várias capturas (para várias tabelas), embora desejemos reverter toda a bagunça, mesmo que a última atualização falhe.
SET XACT_ABORT ON;
BEGIN TRANSACTION
DECLARE @message AS VARCHAR(MAX) = '';
-- TABLE 1
BEGIN TRY
UPDATE TABLE xx
SET yy = zz
END TRY
BEGIN CATCH
SET @message = 'TABLE 1 '+ ERROR_MESSAGE();
INSERT INTO LOGTABLE
SELECT
GETDATE(),
@message
RETURN;
END CATCH
-- TABLE 2
BEGIN TRY
UPDATE TABLE sss
SET tt = xyz
END TRY
BEGIN CATCH
SET @message = 'TABLE 2 '+ ERROR_MESSAGE();
INSERT INTO LOGTABLE
SELECT
GETDATE(),
@message
RETURN;
END CATCH
COMMIT TRANSACTION