2017-05-10 13 views
0

私はこの小さなコードを修正するのに苦労しています。私は誰かが助けることを望んでいる。私は何かを欠いているに違いない。Sql whileループでキャッチしよう

これは私が達成しようとしているものです。アーカイブプロセス中に、我々は多くのテーブルから数千から数百万行を削除するプロセスに進みます。いくつかの削除プロセスは他のプロセスより時間がかかります。だから私がやろうとしているのは、実行中のエラーをキャッチし、電子メールで通知することです。また、削除が完了したら私に電子メールを送ろうとしています。

INTERVALコードは削除と大きく機能し、処理に必要です。私は電子メールを送信するためにTry..Catch Blockを正しく追加しようとしています。

これは、今日のテストでのパフォーマンスです。
[削除]の代わりに[選択1/0]を実行すると、エラーが発生します。 "FAILED"メールが届きます。しかし、私はまた、 "COMPLETED"電子メールを取得します。この場合、私は失敗したメールのみを探しています。また、電子メールと "print"行の@Totalcount変数は、この行からいっぱいになっていません - SET @TOTALCOUNT = @TOTALCOUNT + @CHECKCOUNT

以下のコードをエラーなしでDELETEとして実行すると、 "COMPLETED"メール。 @totalcount変数が電子メールと印刷行に入力されても問題はありますが。

完成したSET変数とCompleted電子メールコードをTRYブロックに移動しましたが、運がまったくありませんでした。私はネスティング・トライ・ブロックの非常に多くのバリエーションを試して、ブレークを動かしましたが、それを正しく理解することはできません。どんな助けや指導も大歓迎です。
おかげ

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 = '[email protected]', 
      @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 = '[email protected]', 
     @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) 
+0

タグDBMSを。そのコードは製品固有です。 – jarlh

答えて

1

は、ブール変数を入れて偽の内側キャッチに設定し、その後COMPLETE電子メールを送信するために天気をを決定するためにそれを使用します。

0

あなたの間違いは「中断」と思われます。それはキャッチブロック内でwhileループにしていないことsouldと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 
関連する問題