我可以在事务中运行动态SQL语句并使用EXEC回滚吗:
exec('SELECT * FROM TableA; SELECT * FROM TableB;');
将此放入事务中,并在执行语句后使用@@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