如果不丢失关于原始异常的信息会更好。在SQL Server 2012及更高版本中有一个THROW
子句正是为此目的。因此,你可以简单地做:
BEGIN TRY
BEGIN TRANSACTION [Tran1];
--- Some SQL here --
COMMIT TRANSACTION [Tra1];
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION [Tran1];
THROW;
END CATCH;
在的SQL Server 2008R2及以下,这是更为麻烦保存错误信息:
BEGIN TRY
BEGIN TRANSACTION [Tran1];
--- Some SQL here --
COMMIT TRANSACTION [Tra1];
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION [Tran1];
-- Now throw the exception
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
SELECT @ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE();
RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState);
END CATCH;
也许你需要的是加分号,如下所示: 'ROLLBACK TRANSACTION [Tran1];' –
你正在使用什么版本的SQL Server? 2008年? – Diego