私はこれに完全に困惑しています。レコードがテーブルに挿入された場合にメールを送信するトリガーがありますが、過去 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