SQL Server XACT_ABORT mit Ausschluss

Ich habe eine größere gespeicherte Prozedur, die mehrere TRY / CATCH-Blöcke verwendet, um einzelne Fehler abzufangen und zu protokollieren. Ich habe auch eine Transaktion um den gesamten Inhalt der Prozedur gewickelt, um im Falle eines Fehlers auf dem Weg dorthin ein Rollback des gesamten Vorgangs durchführen zu können (um eine Menge chaotischer Aufräumarbeiten zu vermeiden). XACT_ABORT wurde aktiviert, da sonst nicht die gesamte Transaktion zurückgesetzt würde.

Schlüsselkomponente
In meiner Datenbank befindet sich eine Tabelle, in die jedes Mal, wenn diese Prozedur ausgeführt wird, ein Datensatz mit den Ergebnissen der Operationen und Einzelheiten zu den Fehlern eingefügt wird.

Lustige Sache passiert - eigentlich war es ziemlich offensichtlich, als ich endlich herausfand, was los war ... Die Einfügeanweisung in meine Protokolltabelle wird ebenfalls zurückgesetzt, daher, wenn mir das SSMS nicht ausgeht Ich werde nicht in der Lage sein zu sehen, dass dies überhaupt ausgeführt wurde, da das Rollback alle Trances der Aktivität entfernt.

Frage
Wäre es möglich, die gesamte Transaktion mit Ausnahme dieser einzelnen Einfügeanweisung zurückzusetzen? Ich möchte die Fehlermeldung, die ich beim Ausführen der gespeicherten Prozedur kompiliere, trotzdem beibehalten.

Vielen Dank

~ Eli

Update 6/28
Hier ist ein Codebeispiel von dem, was ich gerade sehe. Der Hauptunterschied zu den Beispielen von @Alex und @gameiswar besteht darin, dass in meinem Fall alle Try / Catch-Blöcke in der einzelnen Transaktion verschachtelt sind. Der Zweck ist es, mehrere Catches (für die mehreren Tabellen) zu haben, obwohl wir das gesamte Durcheinander zurücksetzen würden, selbst wenn das letzte Update fehlschlagen würde.

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

Antworten auf die Frage(6)

Ihre Antwort auf die Frage