0

我有一个程序,它生成一个制表符分隔的文本文件,并使用 msdb.dbo.sp_send_dbmail 发送一封电子邮件,其中包含学生列表作为附件。

当我通过 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

有什么建议么?

4

2 回答 2

0

我假设您将这封电子邮件连接到一个事件,例如 OnError/OnTaskFailed,可能在根级别。

您添加到控制流中的每个项目都会添加另一层潜在事件。想象一个Control Flowwith a Sequence Containerwhich contains a ForEach Enumeratorwhich contains a Data Flow Task。这是一个相当普遍的设计。这些对象中的每一个都能够根据其包含的对象引发/处理事件。控制流的 OnTaskFailed 事件处理程序和数据流的 OnTaskFailed 事件处理程序之间的距离是 5 个对象深。

数据流失败并引发 OnTaskFailed 消息。该消息一直冒泡到控制流,导致电子邮件 1 被触发。然后数据流终止。ForEach 循环接收到数据流已完成且返回状态为失败的信号,因此现在为 Foreach 循环触发 OnTaskFailed 错误。重复这个模式直到每个任务/容器都引发了他们自己的事件。

分辨率取决于,但通常人们通过仅将通知放在最内部的对象(在我的示例中为数据流)或禁用事件处理程序的渗透来解决此问题。

于 2013-10-10T18:26:56.947 回答
0

在此处检查解决方案(它对我有用,因为我一次收到 2 个) -使用 SP_SEND_DBMAIL 向所有收件人发送重复电子邮件的存储过程

将重试次数从 X 更改为 0。现在我只收到 1 封电子邮件。如果您的用户收到 4 封电子邮件,间隔正好 1 分钟,这一点会更加明显。

于 2013-11-06T11:14:07.477 回答