私は、SQL Server / TSQLでの動的SQLをロールバックすることができます
-
13-09-2019 - |
質問
私は、トランザクション内の動的SQLを実行して、EXECを使用してロールバックすることができます:
exec('SELECT * FROM TableA; SELECT * FROM TableB;');
取引でこれを入れて、ロールバックを行うにはexec文の後、@@エラーを使用します。
など。コード
BEGIN TRANSACTION
exec('SELECT * FROM TableA; SELECT * FROM TableB;');
IF @@ERROR != 0
BEGIN
ROLLBACK TRANSACTION
RETURN
END
ELSE
COMMIT TRANSACTION
がN動的SQL文であり、エラーがnで発生した場合/ 2意志に第1((N / 2) - 1)ステートメントがロールバックされる
<時間>最初の答えについての質問
@@エラーは、ほとんどのエラーをピックアップしません。 それはそれは、トランザクションがコミットする可能性を意味し、エラーを、ピックアップしていない可能性があることを意味しますか?どちらの目的に反し
SQL ServerのTRY / CATCH 2005+ はい私は、SQL Server 2005を使用していますが、前に試しキャッチを使用していません やってしまう、以下のトリックを行います。
BEGIN TRANSACTION
BEGIN TRY
exec('SELECT * FROM TableA; SELECT * FROM TableB;');
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
END CATCH
OR私は
ネット上でいくつかのより多くの例を見てBEGIN TRY --Start the Try Block..
BEGIN TRANSACTION -- Start the transaction..
exec('SELECT * FROM TableA; SELECT * FROM TableB;');
COMMIT TRAN -- Transaction Success!
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRAN --RollBack in case of Error
RAISERROR(ERROR_MESSAGE(), ERROR_SEVERITY(), 1)
END CATCH
解決
はい。 TXNsは、現在のセッション/接続に属し、動的SQLは同じコンテキストを使用します。
ただし、@@ ERRORは、最も可能性の高いエラーをピックアップしません。状況は、問題文の直後にチェックする必要があります。私は、SQL Server 2005の+
と仮定すると、TRY / CATCHを使用したいです編集:TRY / CATCHがOKに動作するはずです。
。他のヒント
キャッチが、仕事それを自分でテストする試すことのために私たちの言葉を服用しないでください。これは、動的SQLであるので、一番簡単な方法は、最初の文は正しい行い(そしてもちろん、それは挿入や削除、豆の更新にmneedsまたはatransactionの必要がない)、次いで第2のなステートメントで意図的な構文エラーを作ることです。そして、その更新インサートをテストするか、最初に文で削除して行きました。
私はまた、原則として、動的SQLが悪い習慣であることを指摘したいと思います。これは本当に動的にする必要がありますか。