これは元の質問からの大幅な編集であり、より簡潔にし、既存の回答によって提起されたポイントをカバーしています...
単一のトランザクション内で複数のテーブルに複数の変更を加え、一部の変更のみをロールバックすることは可能ですか?
以下の TSQL では、「myLogSP」によって行われた変更がロールバックされることは望ましくありません。ただし、さまざまな myBusinessSP によって行われたすべての変更は、必要に応じてロールバックする必要があります。
BEGIN TRANSACTION
EXEC myLogSP
EXEC @err = myBusinessSPa
IF (@err <> 0) BEGIN ROLLBACK TRANSACTION RETURN -1 END
EXEC myLogSP
EXEC @err = myBusinessSPb
IF (@err <> 0) BEGIN ROLLBACK TRANSACTION RETURN -1 END
EXEC myLogSP
EXEC @err = myBusinessSPc
IF (@err <> 0) BEGIN ROLLBACK TRANSACTION RETURN -1 END
EXEC myLogSP
COMMIT TRANSACTION
RETURN 0
順序は重要です。myLogSP は、myBusinessSP の間および後に発生する必要があります (myLogSP は、myBusinessSP によって行われた変更を取得します)。
データベースの整合性を維持し、必要に応じてすべての変更をロールバックできるようにするために、すべての myBusinessSP が 1 つのトランザクション内で発生することも重要です。
あたかも、myLogSP がトランザクションの一部ではないかのように動作することを望んでいるかのようです。(myBusinessSP 間で呼び出す必要があるため) それらがたまたま 1 つの内部にあるというのは不都合な事実です。
編集:
最終的な答えは「いいえ」です。唯一のオプションは、コードを再設計することです。ロギングにテーブル変数を使用するか (変数はロールバックされないため)、トランザクションを必要としないようにビジネス ロジックを再設計します...