2015-07-09 45 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;