【发布时间】:2009-12-07 07:06:00
【问题描述】:
能否在事务中运行动态 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
【问题讨论】:
标签: sql tsql error-handling transactions dynamic-sql