2

我有很长的脚本,其中包含创建表、创建模式、插入数据、更新表等。我只能通过批量脚本来执行此操作。我之前运行过它,但每次由于这个对象会产生一些错误时它都会创建存在于数据库中。因此,如果出现问题,需要一些可以处理批处理执行的机制,整个脚本应该回滚。

感谢帮助和时间。

--343

4

2 回答 2

1

虽然我可能没有抓住您问题的所有细微差别,但我相信XACT_ABORT将提供您所寻求的功能。只需添加一个

SET XACT_ABORT ON;

到脚本的开头。

在 SQL Server 2005 版中,您还可以访问TSQL 中的try/catch块。

于 2013-07-20T19:27:21.303 回答
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
于 2013-07-20T20:19:27.067 回答