SQL Server尝试在while循环语句中捕获..在异常后循环会继续吗?

时间:2016-04-26 06:10:50

标签: sql-server

WHILE(@InitialLoopValue <= @FinalLoopValue)
BEGIN  
    BEGIN TRY
        INSERT INTO Table(GCMRegId, Title, Url, OSType, NotificationType, IMEICode)     
            SELECT 
                GCMRegId, @Title, @Url, SourceId, SubsMasterId, IMEICode 
            FROM 
                #EligibleForNotification WITH(NOLOCK) 
            WHERE
                Id = @InitialLoopValue                
    END TRY
    BEGIN CATCH

    END CATCH   

    SET @InitialLoopValue  = @InitialLoopValue  + 1     
END

这不是确切的代码,但我已经删除了此问题所需的最低代码。 try块内的INSERT语句有时可能会导致主键违规。

我不希望循环因主键违规而终止。相反,我希望它继续而不插入违反的特定行。

这样做是否正确?

1 个答案:

答案 0 :(得分:2)

一个简单的测试就可以证明这一点。这个循环将运行到无穷大。

create table #test
(
id int not null primary key
)



declare @n int=1
while @n<10
begin
begin try
insert into #test
select @n
end try

begin catch
select ERROR_MESSAGE();
end catch
select @n=@n

end

有一些errors会破坏循环,如下所示。

  

TRY ... CATCH构造不会捕获以下条件:

     
      
  1. 严重性为10或更低的警告或信息性消息。

  2.   
  3. 严重性为20或更高的错误,用于停止会话的SQL Server数据库引擎任务处理。如果发生严重性为20或更高且数据库连接未中断的错误,则TRY ... CATCH将处理错误。

  4.         

    3.注意,例如客户端中断请求或客户端连接中断。

         
        
    1. 系统管理员使用KILL语句结束会话时。
    2.