質問

私は、トランザクション内の動的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が悪い習慣であることを指摘したいと思います。これは本当に動的にする必要がありますか。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top