2

私はこれに完全に困惑しています。レコードがテーブルに挿入された場合にメールを送信するトリガーがありますが、過去 20 分ほど挿入されていない場合に限ります。挿入クエリで GETDATE() が好きではないという事実に絞り込みました。

ストアド プロシージャを更新して "2013-03-07 09:53:54.12" のような静的な日時文字列を挿入すると、トリガーが実行され、送信できるようにメール本文が作成されます。ストアド プロシージャで GETDATE() または SYSDATETIME() を使用している場合、select コマンドの実行後に body 変数は空になります。

何か不足していますか?これについて以前に投稿されたものを見つけることができませんでしたが、シナリオが既に投稿され、ここで解決されていることをお詫びします.

MVC プロジェクトの挿入コマンドは次のようになります。

SqlConnection conn = new SqlConnection();
        conn.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["RegistrationEntriesConnectionString"].ToString();

        SqlCommand command = new SqlCommand("RegisterCustomerDownload", conn);
        command.CommandType = System.Data.CommandType.StoredProcedure;

        command.Parameters.AddWithValue("@Email", userEmail);
        command.Parameters.AddWithValue("FileDownloaded", "Product Name Here");

        try
        {
            //Open connection and try to execute the command
            conn.Open();
            command.ExecuteNonQuery();

            conn.Close();
        }
        catch (Exception ex)
        {
            //do something
        }

私のストアドプロシージャは次のようになります。

SET NOCOUNT ON;

INSERT INTO TrialDownloads(Email, FileDownloaded, DownloadTime) 
VALUES(@Email, @FileDownloaded, GETDATE());

そこから、最後に一致するレコードが 20 分以上前に挿入された場合にメールを送信するトリガー (挿入用) があります。

SET NOCOUNT ON;

DECLARE @body NVARCHAR(MAX) = N'';

--For debugging purposes
INSERT INTO [DebugLog] (message) VALUES ('Entered SendTrialDownloadEmail');

SELECT @body += 'A trial has been downloaded:' +
        CHAR(13) + CHAR(10)+ 'Email Address: ' + Email +
        CHAR(13) + CHAR(10)+ 'Product Downloaded ' + FileDownloaded +
        CHAR(13) + CHAR(10)+ 'Date Downloaded: ' + CONVERT(NVARCHAR, DownloadTime)
    FROM [inserted] i 
        WHERE NOT EXISTS (SELECT * FROM [dbo].[TrialDownloads] o 
        WHERE 20 > DATEDIFF(minute, o.DownloadTime, GETDATE()) 
            AND i.Email = o.Email 
            AND i.FileDownloaded = o.FileDownloaded);

--For debugging purposes
INSERT INTO [DebugLog] (message) VALUES ('Before IF block');
INSERT INTO [DebugLog] (message) VALUES (@body);
DECLARE @insertCount NVARCHAR(MAX);
SELECT @insertCount = CONVERT(nvarchar, COUNT(*)) FROM inserted
INSERT INTO DebugLog (message) VALUES (@insertCount);


IF NOT @body = N''
    BEGIN
        EXEC msdb.dbo.sp_send_dbmail 
            @profile_name="NoReplyProfile",
            @recipients="email@domain.com",
            @subject="A Trial has been downloaded",
            @body=@body;
        INSERT INTO [DebugLog] (message) VALUES ('Mail sent');
        INSERT INTO [DebugLog] (message) VALUES (@body);
    END
4

2 に答える 2

2

Jason が気付いたことに基づいて、キー フィールドまたはTrialRegistrationsテーブルで NOT EXIST (...) 句もフィルター処理することをお勧めします。それをするなら、あなたはまっすぐであるべきだと思います。

...

WHERE NOT EXISTS (SELECT * FROM [dbo].[TrialDownloads] o 
        WHERE 20 > DATEDIFF(minute, o.DownloadTime, GETDATE()) 
            AND i.Email = o.Email 
            AND i.FileDownloaded = o.FileDownloaded
            AND NOT i.Id = o.Id)
于 2013-03-07T16:42:30.970 に答える
1

したがって、主なことは、その行と現在の日付の差が 20 分未満であり、その行が同じ電子メールを共有しているメイン テーブルの WHERE NOT EXISTS 行に基づいて電子メールを作成しているように見えます。挿入された値として filedownloaded 値。

そのため、true の行がない場合にのみメールを受け取ることになりますが、true の行、挿入したばかりの行が既に存在します。

于 2013-03-07T16:20:36.410 に答える