以下sql在RAISEERROR
处给出了语法错误,如果我从查询中删除[Tran1]
,则会失败。回滚别名事务然后调用RAISERROR
?
BEGIN TRY
BEGIN TRANSACTION [Tran1]
...sql goes here...
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION [Tran1]
RAISEERROR ('Error occured')
END CATCH;
另外,如果我删除了[Tran1]
我得到了:
无法回滚RAISEERROR。没有该名称的事务或保存点 被发现了。
答案 0 :(得分:0)
您没有在'TRY'块中提及必要的COMMIT TRANSACTION [Tran1]。我认为你有这个。
RAISERROR会自动引发错误,因为它必须编码为
Cell Subclass B
。
带错误的RAISERROR语句将调用BEGIN CATCH部分,但ROLLBACK不再有任何事务。
答案 1 :(得分: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;