我有一个过程,它生成一个制表符分隔的文本文件,并使用msdb.dbo.sp_send_dbmail发送一封电子邮件,其中包含学生列表作为附件。
当我执行SQL服务器管理工作室的过程时,它只发送一封电子邮件。但我创建了一个 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(在数据库邮件配置向导中(,以查看它是否有任何区别。但它并没有解决问题。帐户重试尝试 0帐户重试延迟 0DatabaseMailExeMinimumLifeTime 0
有什么建议吗?
我假设你把这封电子邮件连接到一个事件,比如OnError/OnTaskFailed,可能是在根级别。
添加到控制流的每个项目都会添加另一层潜在事件。想象一个带有Sequence Container
的Control Flow
,其中包含一个包含Data Flow Task
的ForEach Enumerator
。这是一个相当常见的设计。其中每个对象都能够根据其包含的对象引发/处理事件。控制流的 OnTaskFailed 事件处理程序与数据流的 OnTaskFailed 事件处理程序之间的距离为 5 个对象。
数据流失败并引发 OnTaskFailed 消息。该消息一直冒泡到控制流,导致电子邮件 1 被触发。然后,数据流终止。ForEach 循环接收数据流已完成且返回状态为失败的信号,因此现在 Foreach 循环将触发 OnTaskFailed 错误。重复此模式,直到每个任务/容器都引发了自己的事件。
分辨率取决于,但通常人们可以通过仅将通知放在最里面的对象(在我的示例中为数据流(或禁用事件处理程序的渗透来解决此问题。
在这里检查解决方案(它对我有用,因为我一次得到 2 个( - 使用SP_SEND_DBMAIL向所有收件人发送重复电子邮件的存储过程
将重试次数从 X 更改为 0。 现在我只收到 1 封电子邮件。 如果您的用户收到 4 封电子邮件,相隔正好 1 分钟,则会更加明显。