我有一个生成制表符分隔文本文件的程序,并使用msdb.dbo.sp_send_dbmail发送一封包含学生列表作为附件的电子邮件。
当我执行程序thoruhg SQL server management studio时,它只发送一封电子邮件。 但是我创建了一个SSIS包并安排了每晚运行的工作。此作业将4封电子邮件发送给每个收件人。
EXEC msdb.dbo.sp_send_dbmail @profile_name = 'A'
,@recipients = @email_address
,@subject = 'Error Records'
,@query = 'SELECT * FROM ##xxxx'
,@attach_query_result_as_file = 1
,@query_attachment_filename = 'results.txt'
,@query_result_header = 1
,@query_result_width=8000
,@body = 'These students were not imported'
我已将以下参数设置为0(在数据库邮件配置向导中),以查看它是否有任何区别。但它没有解决问题。 AccountRetryAttempts 0 AccountRetryDelay 0 DatabaseMailExeMinimumLifeTime 0
有什么建议吗?
答案 0 :(得分:0)
我假设你有这个电子邮件连接到一个事件,比如OnError / OnTaskFailed,可能在根级别。
您添加到控制流的每个项目都会添加另一层潜在事件。想象一下Control Flow
Sequence Container
,其中ForEach Enumerator
包含Data Flow Task
,其中包含{{1}}。这是一个相当常见的设计。这些对象中的每一个都能够根据事件包含的对象来引发/处理事件。 Control Flow的OnTaskFailed事件处理程序和Data Flow的OnTaskFailed事件处理程序之间的距离是5个对象。
数据流失败并引发OnTaskFailed消息。该消息一直持续到控制流,导致电子邮件1被触发。然后数据流终止。 ForEach循环接收数据流已完成且返回状态为失败的信号,因此现在为Foreach循环触发OnTaskFailed错误。重复此模式,直到每个任务/容器都引发了自己的事件。
分辨率取决于,但通常人们通过将通知放在最里面的对象(我的示例中的数据流)或禁用事件处理程序的渗透来解决这个问题。
答案 1 :(得分:0)
在这里查看解决方案(这对我有用,因为我一次得到2个) - Stored procedure using SP_SEND_DBMAIL sending duplicate emails to all recipients
将重试次数从X更改为0.现在我只收到1封电子邮件。如果您的用户收到4封电子邮件,相隔1分钟就会更明显。