首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sql Try Catch with while-loop

Sql Try Catch with while-loop
EN

Stack Overflow用户
提问于 2017-05-10 21:25:48
回答 2查看 6K关注 0票数 0

我一直在努力纠正这一小段代码。我希望有人能帮上忙。我一定漏掉了什么。

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

INTERVAL代码可以很好地处理delete操作,并且对于我们的过程来说是必要的。我只是试图正确添加一个Try..Catch块来发送电子邮件。

这是今天测试时的表现。

当我运行Select 1/0而不是Delete来强制错误时。我会收到“失败”的邮件。不过,我也会收到“完成”的电子邮件。在这种情况下,我只会寻找失败的电子邮件。此外,对于电子邮件和"print“行,@Totalcount变量不会从此行填充- SET @TOTALCOUNT = @TOTALCOUNT + @CHECKCOUNT

当我运行下面的代码作为一个删除没有失败,我得到了“完成”的电子邮件。尽管仍然存在为电子邮件和打印行填充@totalcount变量的问题。

我已经将已完成的SET变量和已完成的电子邮件代码移到TRY块中,但没有太多运气。我已经尝试了太多嵌套、Try块和移动中断的变体,但我就是看不到正确的方法。任何帮助和指导都将不胜感激。

谢谢

代码语言:javascript
复制
 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)
EN

回答 2

Stack Overflow用户

发布于 2017-05-10 21:34:51

放置一个布尔变量,在catch中将其设置为false,然后使用它来确定是否发送完整的电子邮件。

票数 1
EN

Stack Overflow用户

发布于 2017-05-16 20:41:33

我假设您的错误是"break";它应该在while循环中,而不是catch-block中,并且应该根据前面提到的omoret这样的变量进行检查。

示例:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43893854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档