2014-04-15 36 views
0

我有一个存储过程如下图所示:回滚事务多种查询

DECLARE @FinalQuery varchar(max), @TableName varchar(200) 
DECLARE ListTable CURSOR FOR SELECT.... 
DECLARE @isError bit=0 
OPEN ListTable 
FETCH NEXT FROM ListTable INTO @TableName 
WHILE @@FETCH_STATUS=0 
BEGIN 
    //Some code to generate @FinalQuery to merge data into table @TableName 
    BEGIN TRY 
     EXEC(@FinalQuery) 
    END TRY 
    BEGIN CATCH 
     Set @IsError = 1 
     //Some code to write error to log file. 
    END CATCH 
    FETCH NEXT FROM ListTable INTO @TableName 
END 
CLOSE ListTable 
DEALLOCATE ListTable 

现在,我想事务和回退添加到我的存储过程。我希望执行所有动态的@FinalQuery查询,最后,当它结束时,如果存在任何错误(@ IsError = 1),则会回滚所有内容。我怎样才能做到这一点 ?

回答

0
BEGIN TRAN 
BEGIN TRY 
    EXEC(@FinalQuery) 
END TRY 
BEGIN CATCH 
    Set @IsError = 1 
    //Some code to write error to log file. 
ROLLBACK 
END CATCH 
COMMIT 
+0

我得到这个错误:Microsoft分布式事务处理协调器(MS DTC)取消了分布式事务。更新了 – user2500561

+0

,试试这个。 – glaeran

+0

不同错误:当前事务不能提交,并且不能支持写入日志文件的操作。回滚事务。 – user2500561

0

由于您希望所有更改在发生错误时回滚,您是否试图将事务移出循环?

OPEN ListTable 
FETCH NEXT FROM ListTable INTO @TableName 
BEGIN TRY 
    WHILE @@FETCH_STATUS=0 
    BEGIN 
     //Some code to generate @FinalQuery to merge data into table @TableName 
     EXEC(@FinalQuery) 
     FETCH NEXT FROM ListTable INTO @TableName 
    END 
    COMMIT 
END TRY 
BEGIN CATCH 
    Set @IsError = 1 
    //Some code to write error to log file. 
    ROLLBACK 
END CATCH 
CLOSE ListTable 
DEALLOCATE ListTable