我有一个很长的脚本,其中包含创建表,创建模式,插入数据,更新表等。我必须通过批处理脚本执行此操作。我之前运行它但是每次因为此而导致出现错误一些对象将出现在数据库中。因此,如果出现问题,需要一些可以处理批处理执行的机制,应该回滚整个脚本。
赞赏的帮助和时间。
- 343
答案 0 :(得分:1)
虽然我可能没有抓住您问题的所有细微差别,但我相信XACT_ABORT会提供您所寻求的功能。只需添加一个
SET XACT_ABORT ON;
到脚本的开头。
使用2005版本的SQL Server,您也可以访问TSQL中的try/catch块。
答案 1 :(得分:1)
试试这个:
DECLARE @outer_tran int;
SELECT @outer_tran = @@TRANCOUNT;
-- find out whether we are inside the outer transaction
-- if yes - creating save point if no starting own transaction
IF @outer_tran > 0 SAVE TRAN save_point ELSE BEGIN TRAN;
BEGIN TRY
-- YOUR CODE HERE
-- if no errors and we have started own transaction - commit it
IF @outer_tran = 0 COMMIT;
END TRY
BEGIN CATCH
-- if error occurred - rollback whole transaction if it is own
-- or rollback to save point if we are inside the external transaction
IF @outer_tran > 0 ROLLBACK TRAN save_point ELSE ROLLBACK;
--and rethrow original exception to see what happens
DECLARE
@ErrorMessage nvarchar(max),
@ErrorSeverity int,
@ErrorState int;
SELECT
@ErrorMessage = ERROR_MESSAGE() + ' Line ' + cast(ERROR_LINE() as nvarchar(5)),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE();
RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState);
END CATCH