Sqlserver Try Catch时Catch捕获到错误则重试一次的写法时间:2022-11-29 18:08:41最初代码如下: ```sql BEGIN TRY EXECUTE sys.sp_testlinkedserver @LogicalName SET @SQLOnline = 1 END TRY BEGIN CATCH SET @SQLOnline = 0 print ERROR_MESSAGE() END CATCH ``` 此代码有个问题,就是linked server一旦无法连接就报错了,没有重试功能,我们希望第一次出错后,可以有第二次重试机会,如果第二次重试也出错了,那么就算出错 改成如下正确 ```sql ``BEGIN BEGIN TRY EXECUTE sys.sp_testlinkedserver @LogicalName SET @SQLOnline = 1 END TRY BEGIN CATCH SET @SQLOnline = 0 print ERROR_MESSAGE() END CATCH IF @SQLOnline = 0 BEGIN BEGIN TRY EXECUTE sys.sp_testlinkedserver @LogicalName SET @SQLOnline = 1 END TRY BEGIN CATCH SET @SQLOnline = 0 print ERROR_MESSAGE() END CATCH END END`` ``` 得出结论: 1、如果IF后面没有ELSE,则IF后面的第一个BEGIN..END语句块受IF的条件影响,第二个BEGIN..END语句块不受IF的条件影响,特殊情况BEGIN TRY...END TRY和BEGIN CATCH...END CATCH是一体的,如果他们两者放入IF后面,不会因为两个BEGIN就会导致BEGIN CATCH...END CATCH不受IF管控 2、这种Try Catch的,直接在Try使用while重试一次不太好,如果try catch在游标里面,这样的话每个游标记录都要在try里面执行两次。还是需要等到Catch的结果来重试比较合适,所有用IF比较合适 改成以下错误 ```sql BEGIN TRY DECLARE @Counter int; SET @Counter = 1; WHILE @Counter