SQL Server 2008:在CURSOR中开始尝试和开始交易

时间:2014-08-04 14:53:54

标签: sql sql-server

我正在尝试遍历许多记录并处理它们中的每一个。即使在处理过程中出现ERROR,光标仍应继续循环记录,但在批处理结束时,我希望看到所有记录产生错误的错误消息。

我有以下代码:

FOR SELECT ....

    OPEN cur
    FETCH next FROM cur INTO
    @some_variables
    WHILE @@fetch_status = 0
    BEGIN

    BEGIN TRY
      BEGIN TRANSACTION
        ...process the record...
      COMMIT
    END TRY

   BEGIN CATCH
   ROLLBACK

     RAISERROR ('%s',16, 1, @variable_containing_error)

    END CATCH
    END

            FETCH next FROM cur INTO
           @some_variables


    CLOSE cur
    DEALLOCATE cur

如果我处理两个有错误的记录,我只收到第一条错误消息而不是第二条记录错误消息。

我不确定我是否正确使用BEGIN TRY和TRANSACTION命令。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:3)

当您进行回滚时,您应该尝试不使用该事务,它会停止您的代码试试这个:

While @@Fetch_Status=0
Begin
    Begin Try
        <You code goes here>        
    End Try
    Begin Catch
        RAISERROR ('%s',16, 1, @variable_containin_gerror)
    End Catch

    FETCH next FROM cur INTO
       @some_variables
End

制作此代码我发现您遇到错误:

在进行下一步的提取之前,您正在关闭光标。另外,你应该尝试在最后一次获取之后将最后一个结尾。

答案 1 :(得分:0)

我怀疑16的错误严重性终止了您的批次。

尝试做这样的事情:

DECLARE @error_status BIT
SET @error_status = CONVERT(BIT, 0)

OPEN cur
FETCH NEXT FROM cur INTO @some_variables
WHILE @@fetch_status = 0
    BEGIN

        BEGIN TRY
            BEGIN TRANSACTION
            /*...process the record...*/
            COMMIT
        END TRY

        BEGIN CATCH
            ROLLBACK

            RAISERROR ('%s',1, 1, @variable_containing_error)
            SET @error_status = CONVERT(BIT, 1)

        END CATCH
    END

FETCH NEXT FROM cur INTO @some_variables

CLOSE cur
DEALLOCATE cur

IF @error_status = CONVERT(BIT, 1)
    RAISERROR ('See preceding errors(s).',16, 1)

这里我使用较低的严重性来打印错误消息,但是如果抛出错误,我会在批处理结束时提高严重性级别16。