2

次のような構造のストアド プロシージャがいくつかあります。

USE [WHouse]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[pr_Alert_Dly]
AS
    IF (SELECT LastRunDate FROM WHouse.dbo.AlertRunDates WHERE NameDescription = 'X' ) < (SELECT CONVERT(DATE, GETDATE()))
    BEGIN
       --================
       --need to comment the following out if trying to re-run
       UPDATE x 
       SET  x.LastRunDate = CONVERT(DATE,GETDATE())
       FROM WHouse.dbo.AlertRunDates x
       WHERE [NameDescription] = 'X' 
       --================

       --===============
       --DO A LOAD OF STUFF IN HERE 
       --INCLUDING USING DB_SENDMAIL TO EMAIL 20 PEOPLE
       --===============

    END

私の同僚は、10 分ごとにループし、ストアド プロシージャがエラーなしで完了する限り、制御テーブルで完了としてマークされるレポート システム (プロシージャ/SSIS を使用) をセットアップしました。

私が理解できないのは、上記がエラーをスローしたとしても、なぜBEGIN / END同じバッチで複数回セクションを繰り返すのでしょうか?

防御が十分でない場合、同僚のシステムによって同じメールが 10 分ごとに配信されるのを防ぐにはどうすればよいでしょうか。

4

1 に答える 1

0

最終的に OP のパターンを破棄し、OP のコメントで Aaron が提唱した提案を使用しました。つまり、EmailQueueテーブルを作成し、5 分ごとにループするバックグラウンド プロセスを設定しました ( 経由Agent)。EmailQueueこのプロセスでは、新しいレコードがないかテーブルをスキャンし、必要に応じて電子メールを送信します。

于 2012-11-16T23:27:20.877 に答える