Sql 为什么此过程会生成两封电子邮件?
我们的代理每5分钟运行一次以下存储过程—它使用此过程扫描表Sql 为什么此过程会生成两封电子邮件?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我们的代理每5分钟运行一次以下存储过程—它使用此过程扫描表Control\u EmailQueue,查看是否有新的电子邮件要发送 我想测试在表Control\u EmailQueue中输入不正确的电子邮件信息时proc的行为。下面详细介绍了两次试验及其结果 TEST1 我向Control\u EmailQueue添加了一条记录,该记录在所有3个字段EmailTO/EmailCC和EmailBCC中都有NULL条目。这工作正常,即错误被捕获,执行CATCH中的代码,因此我收到一封标题为“电子邮件创
Control\u EmailQueue
,查看是否有新的电子邮件要发送
我想测试在表Control\u EmailQueue
中输入不正确的电子邮件信息时proc的行为。下面详细介绍了两次试验及其结果
TEST1我向
Control\u EmailQueue
添加了一条记录,该记录在所有3个字段EmailTO/EmailCC和EmailBCC
中都有NULL
条目。这工作正常,即错误被捕获,执行CATCH
中的代码,因此我收到一封标题为“电子邮件创建期间出错”的电子邮件
TEST2
我将记录添加到控制\u电子邮件队列
。在字段EmailTO
I中输入此字符串'me@me.co.uk; xxxxxxx@xxxxx“
即第一个电子邮件地址有效,但第二个电子邮件地址无效。当代理运行该过程时,me@me.co.uk
但半秒钟后,me@me.co.uk
。由于未收到标题为“电子邮件创建期间出错”的电子邮件,因此本测试中未执行捕获代码
BEGIN TRY
DECLARE @Exit TINYINT = 0
WHILE @Exit = 0
BEGIN
BEGIN TRANSACTION
DECLARE @MailIdFound INT =
(
SELECT
CASE
WHEN MIN([EmailId]) IS NULL THEN 0
ELSE MIN([EmailId])
END
FROM [xxx].[console].[Control_EmailQueue]
WHERE
[DateInsertKey] IS NOT NULL
AND
( --the following gives option to re-run past mails by updating DateEmailKey to NULL
[DateEmailKey] IS NULL
OR
[DateEmailKey] < [DateInsertKey]
)
AND
ErrorOccured = 0
AND
EmailActive = 1
)
IF @MailIdFound = 0
BEGIN SET @Exit = 1 END --exit here as
ELSE
BEGIN --send the mail here
--DECLARE @EmailId INT
DECLARE @DateInsertKey INT
DECLARE @DateEmailKey INT
DECLARE @CallingReportName NVARCHAR(1000)
DECLARE @EmailBCC NVARCHAR(1000)
DECLARE @EmailTO NVARCHAR(1000)
DECLARE @EmailCC NVARCHAR(1000)
DECLARE @EmailBody NVARCHAR(MAX)
DECLARE @EmailAttachmentPath NVARCHAR(1000)
DECLARE @EmailImportance VARCHAR(6)
DECLARE @EmailSubject NVARCHAR(1000)
;WITH myMostUrgentMail_cte
AS
(
SELECT
TOP 1
--[EmailId],
[DateInsertKey],
[DateEmailKey],
[CallingReportName],
[EmailBCC],
[EmailTO],
[EmailCC],
[EmailBody],
[EmailAttachmentPath],
[EmailImportance],
[EmailSubject]
FROM [xxx].[console].[Control_EmailQueue]
WHERE [EmailId] = @MailIdFound
)
SELECT
@DateInsertKey = [DateInsertKey],
@DateEmailKey = [DateEmailKey],
@CallingReportName = [CallingReportName],
@EmailTO = [EmailTO],
@EmailCC = [EmailCC],
@EmailBCC = [EmailBCC],
@EmailBody = [EmailBody],
@EmailAttachmentPath = [EmailAttachmentPath],
@EmailImportance = CASE
WHEN [EmailImportance] = 0 THEN 'Low'
WHEN [EmailImportance] = 1 THEN 'Normal'
WHEN [EmailImportance] = 2 THEN 'High'
END,
@EmailSubject = [EmailSubject]
FROM myMostUrgentMail_cte
SET @EmailBody = @EmailBody + '<b>Please contact us with any questions</b></p></span></html>'
EXEC msdb..sp_send_dbmail
@recipients = @EmailTO,
@copy_recipients = @EmailCC,
@blind_copy_recipients = @EmailBCC,
@subject = @EmailSubject,
@file_attachments = @EmailAttachmentPath,
@Importance = @EmailImportance,
@body_format = 'html',
@body = @EmailBody
UPDATE x
SET
x.[DateEmailKey] = (CONVERT(CHAR(8),GETDATE(),(112))),
x.[DateEmailTime] = (CONVERT([time](7),left(CONVERT([char](12),GETDATE(),(114)),(8)),(0)))
FROM [xxx].[console].[Control_EmailQueue] x
WHERE x.[EmailId] = @MailIdFound
END
COMMIT TRANSACTION
END
END TRY
BEGIN CATCH
IF @@trancount>0
BEGIN
ROLLBACK TRANSACTION
END
-- handle error here
DECLARE @ErrorMessage VARCHAR(100) = '<html><p>Error occured during creation of EmailId: ' + CONVERT(VARCHAR(10),@MailIdFound) + '</p><p>xxx.console.Control_EmailQueue</p></html>'
EXEC msdb..sp_send_dbmail
@recipients = 'me@me.co.uk;'
, @subject = 'ERROR OCCURED DURING EMAIL CREATION'
, @body_format = 'html'
, @body = @ErrorMessage
UPDATE x
SET x.ErrorOccured = 1
FROM [xxx].[console].[Control_EmailQueue] x
WHERE x.[EmailId] = @MailIdFound
END CATCH;
END
开始尝试
声明@Exit TINYINT=0
而@Exit=0
开始
开始交易
声明@maildfound INT=
(
挑选
案例
当MIN([EmailId])为空时,则为0
ELSE最小值([EmailId])
结束
来自[xxx]。[控制台]。[控制\u电子邮件队列]
哪里
[DateInsertKey]不为空
及
(-下面提供了通过将DateEmailKey更新为NULL来重新运行过去邮件的选项
[DateEmailKey]为空
或
[DateEmailKey]<[DateInsertKey]
)
及
错误发生=0
及
EmailActive=1
)
如果@maildfound=0
BEGIN SET@Exit=1 END——在此处退出为
其他的
开始--在这里发送邮件
--声明@EmailId INT
声明@DateInsertKey INT
声明@DateEmailKey INT
声明@CallingReportName NVARCHAR(1000)
声明@EmailBCC NVARCHAR(1000)
声明@EmailTO NVARCHAR(1000)
声明@EmailCC NVARCHAR(1000)
声明@EmailBody NVARCHAR(最大值)
声明@EmailAttachmentPath NVARCHAR(1000)
声明@email重要性VARCHAR(6)
声明@EmailSubject NVARCHAR(1000)
;用粘菌粉
作为
(
挑选
第一名
--[EmailId],
[DateInsertKey],
[DateEmailKey],
[CallingReportName],
[电邮密件抄送],
[电邮至],
[EmailCC],
[电邮正文],
[EmailAttachmentPath],
[电邮重要性],
[电邮主题]
来自[xxx]。[控制台]。[控制\u电子邮件队列]
其中[EmailId]=@maildfound
)
挑选
@DateInsertKey=[DateInsertKey],
@DateEmailKey=[DateEmailKey],
@CallingReportName=[CallingReportName],
@EmailTO=[EmailTO],
@EmailCC=[EmailCC],
@EmailBCC=[EmailBCC],
@EmailBody=[EmailBody],
@EmailAttachmentPath=[EmailAttachmentPath],
@电子邮件重要性=案例
当[EmailImportance]=0时,则为“低”
当[电子邮件重要性]=1时,则为“正常”
当[电子邮件重要性]=2时,则为“高”
完,,
@EmailSubject=[EmailSubject]
来自myMostUrgentMail
SET@EmailBody=@EmailBody+'如有任何问题,请与我们联系'
EXEC msdb..sp_send_dbmail
@收件人=@EmailTO,
@复制收件人=@EmailCC,
@盲拷贝收件人=@EmailBCC,
@subject=@EmailSubject,
@文件\附件=@EmailAttachmentPath,
@重要性=@email重要性,
@body_format='html',
@body=@EmailBody
更新x
设置
x、 [DateEmailKey]=(转换(CHAR(8),GETDATE(),(112)),