我正在尝试遍历许多记录并处理它们中的每一个。即使在处理过程中出现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命令。
有人可以帮忙吗?
答案 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。