2015-07-09 54 views
0

下面的sql給出了一個語法錯誤RAISEERROR,如果我從查詢中刪除[Tran1]就會消失。回滾別名事務的正確語法是什麼,然後調用RAISERRORSql服務器 - 正確的回滾事務的語法

BEGIN TRY 
BEGIN TRANSACTION [Tran1] 
    ...sql goes here... 
END TRY 
BEGIN CATCH 
    ROLLBACK TRANSACTION [Tran1] 
    RAISEERROR ('Error occured') 
END CATCH; 

另外,如果我刪除[Tran1]我得到:

不能回滾RAISEERROR。未找到該名稱的交易或保存點 。

+0

也許你需要的是加分號,如下所示: 'ROLLBACK TRANSACTION [Tran1];' –

+0

你正在使用什麼版本的SQL Server? 2008年? – Diego

回答

0

您沒有在'TRY'塊中提到必要的COMMIT TRANSACTION [Tran1]。我想你有這個。

的RAISERROR會自己產生一個錯誤,因爲它必須被編碼像

RAISERROR('Error Occurred',0,0)

帶有錯誤的RAISERROR語句將調用BEGIN CATCH部分,但ROLLBACK不再有任何事務。

0

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