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
语句有时可能会导致主键违规。
我不希望循环因主键违规而终止。相反,我希望它继续而不插入违反的特定行。
这样做是否正确?
答案 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构造不会捕获以下条件:
严重性为10或更低的警告或信息性消息。
- 醇>
严重性为20或更高的错误,用于停止会话的SQL Server数据库引擎任务处理。如果发生严重性为20或更高且数据库连接未中断的错误,则TRY ... CATCH将处理错误。
3.注意,例如客户端中断请求或客户端连接中断。
- 系统管理员使用KILL语句结束会话时。
醇>