トランザクションで動的 SQL を実行し、EXEC を使用してロールバックできますか?
exec('SELECT * FROM TableA; SELECT * FROM TableB;');
これをトランザクションに入れ、exec ステートメントの後に @@error を使用してロールバックを行います。
例えば。コード
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) 個のステートメントがロールバックされます。
最初の回答に関する質問
@@Error でエラーが検出されない可能性が最も高い エラーが検出されない可能性があるということは、トランザクションがコミットされる可能性があることを意味します。目的に反するもの
SQL Server 2005+ での TRY/CATCH はい SQL Server 2005 を使用していますが、以前に Try Catch を使用したことがありません。
BEGIN TRANSACTION
BEGIN TRY
exec('SELECT * FROM TableA; SELECT * FROM TableB;');
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
END CATCH
または、ネットでさらにいくつかの例を見ました
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