如果不丟失關於原始異常的信息會更好。在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