【问题标题】:Sql Try Catch with while-loopSql Try Catch 与 while 循环
【发布时间】:2017-10-09 04:24:23
【问题描述】:

我一直在努力纠正这一点代码。我希望有人可以提供帮助。我肯定错过了什么。

这是我想要完成的。在归档过程中,我们经历了从许多表中删除数千到数百万行的过程。某些删除过程比其他过程花费更长的时间。所以我想做的是在运行过程中发现任何错误并通过电子邮件通知我。我也想在删除完成时给我发电子邮件。

INTERVAL 代码非常适合删除,并且对于我们的流程是必需的。我只是想正确添加一个 Try..Catch 块来发送电子邮件。

这是今天测试时的表现。
当我运行 Select 1/0 而不是 Delete 来强制出错时。我会收到“失败”的电子邮件。但是,我也会收到“已完成”电子邮件。在这种情况下,我只会寻找失败的电子邮件。同样对于电子邮件和“打印”行,@Totalcount 变量没有从该行填充 - SET @TOTALCOUNT = @TOTALCOUNT + @CHECKCOUNT

当我将以下代码作为 DELETE 运行且没有失败时,我会收到“已完成”电子邮件。尽管电子邮件和打印行的@totalcount 变量仍然存在问题。

我已将已完成的 SET 变量和已完成的电子邮件代码移至 TRY 块,但运气不佳。我已经尝试了很多嵌套尝试块和移动 BREAK 的变体,但我只是看不到它是否正确。任何帮助和指导将不胜感激。
谢谢

 DECLARE
 @INTERVAL INT
,@CHECKCOUNT INT
,@TOTALCOUNT INT
,@starttime DATETIME
,@endDELtime DATETIME
,@endtime DATETIME

 SET @starttime = GETDATE()

 SET @INTERVAL = 10

 SET @TOTALCOUNT = 0

 WHILE 1 = 1 

 BEGIN  
   BEGIN TRY    

    --SELECT 1/0;
    DELETE TOP (@INTERVAL)
        FROM dbo.specphone
         WHERE SPEC IN 
                    (
                     SELECT
                          SPEC
                    FROM dbo.tblGeneral (NOLOCK)
                    )

  END TRY   

BEGIN CATCH
    DECLARE @err_msg AS NVARCHAR(MAX);
    SET @endDELtime = GETDATE()
    SET @err_msg = 'Severity - ' + CONVERT(VARCHAR(10), ERROR_SEVERITY()) + 
    CHAR(13) +
     'Error Number - ' + CONVERT(VARCHAR(10), ERROR_NUMBER()) + CHAR(13) +
     'Error Message - ' + ERROR_MESSAGE() + CHAR(13) +
     'tblspecphone:  ' + 'Total Count ' + CONVERT(VARCHAR, @TOTALCOUNT) + 
      CHAR(13) + 
            ' Start Time is ' + CONVERT(VARCHAR(25), @starttime) + CHAR(13) +
            ' End Time is ' + CONVERT(VARCHAR(25), @endDELtime) ;

        --SELECT ERROR_NUMBER() AS ErrorNumber;
        --SELECT ERROR_MESSAGE() AS ErrorMessage;

            EXEC msdb.dbo.sp_send_dbmail  
            @profile_name = 'default',  
            @recipients = 'gdh@isp.com',  
            @subject = 'FAILED - Archive Project Delete Script',
            @body = @err_msg;
END CATCH                   


    SET @CHECKCOUNT = @@RowCount 

    SET @TOTALCOUNT = @TOTALCOUNT + @CHECKCOUNT

    IF @CHECKCOUNT = 0

    SET @endtime = GETDATE()

    DECLARE
    @bodymsg AS VARCHAR(MAX)
    SET @bodymsg = 'The Delete Query has finished.  Verify and Proceed on 
    with next script if no Errors.' + CHAR(13) + 
        'tblspecphone:  ' + 'Total Count ' + CONVERT(VARCHAR, @TOTALCOUNT) + 
         CHAR(13) + 
            ' Start Time is ' + CONVERT(VARCHAR(25), @starttime) + CHAR(13) 
              +
            ' End Time is ' + CONVERT(VARCHAR(25), @endtime)

        BEGIN   
        EXEC msdb.dbo.sp_send_dbmail  
        @profile_name = 'default',  
        @recipients = 'gdh@isp.com',  
        @body = @bodymsg,   
        @subject = 'Completed - Archive Project Delete Script'; 
        END

       BREAK

     END    


    PRINT '

         tblspecphone:  ' + 'Total Count ' + CONVERT(VARCHAR, @TOTALCOUNT) + 
      ' Start Time is ' + CONVERT(VARCHAR(25), @starttime) + ' End Time is ' 
      + CONVERT(VARCHAR(25), @endtime)

【问题讨论】:

  • 标记您正在使用的 dbms。该代码是特定于产品的。

标签: sql sql-server tsql while-loop try-catch


【解决方案1】:

放一个布尔变量,在catch里面设置为false,然后用它来判断是否发送COMPLETE邮件。

【讨论】:

    【解决方案2】:

    我认为你的错误是“休息”;它应该在 while 循环中,而不是在 catch-block 中,并且应该根据提到的 omoret 之类的变量进行检查

    例子:

    DECLARE @error int
    SET @error = 0
    DECLARE @i int
    SET @i = 5
    WHILE @i > -2
    BEGIN
        BEGIN TRY
           SELECT 1 / @i
           PRINT 'it is ok to divide by ' + cast(@i as varchar)
        END TRY
    
        BEGIN CATCH
           PRINT 'ERROR'
           SET @error = 1 
        END CATCH
        IF @error = 1 
           BREAK;
    
        SET @i = @i - 1
    END
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-24
      • 2014-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多