Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 为什么此过程会生成两封电子邮件?_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 为什么此过程会生成两封电子邮件?

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中的代码,因此我收到一封标题为“电子邮件创

我们的代理每5分钟运行一次以下存储过程—它使用此过程扫描表
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)),