0

如果我公司的员工没有通过 Intranet Web 应用程序完成认证表格,我的任务是向他们发送电子邮件提醒。

我正在考虑编写一个在夜间数据库作业(SQL Server 2008 R2)中调用的存储过程。proc 将选择员工电子邮件地址值并通过光标循环遍历它们,这样对于找到的每封电子邮件,都会使用 msdb.dbo.sp_send_dbmail 发送一封电子邮件。

我担心的是,这是针对一家大公司的,每晚可能会发送数万封电子邮件。发送如此大量的电子邮件时,有没有办法减轻性能问题?还是在数万级别上不应该担心?

4

1 回答 1

2

我认为在您的过程中,您可以创建一个临时表/表变量并用您要发送电子邮件的电子邮件填充它。

一旦您将所有电子邮件都放在一个表中,您就可以将电子邮件地址连接起来;并将其存储到一个变量中,并将该变量作为参数传递给 msdb.dbo.sp_send_dbmail proc 的 @recipients 参数。

像这样的东西...

假设您在过程中填充了一个名为 Emails 的表变量

DECLARE @Emails TABLE(Email NVARCHAR(1000))
INSERT INTO @Emails VALUES
('aaa@aaa.com'),('bbb@aaa.com'),('ccc@aaa.com')  --<-- Three emails you want to send email

电子邮件的串联

DECLARE @Email_List NVARCHAR(MAX);   --<-- Variable to store emails List

SELECT @Email_List = STUFF((SELECT ';' + Email [text()]
                            FROM @Emails
                            FOR XML PATH(''),TYPE)
                            .value('.','NVARCHAR(MAX)'),1,1, '')                   
FROM @Emails e 

-- Test SELECT @Email_List
-- RESULT:  aaa@aaa.com;bbb@aaa.com;ccc@aaa.com

现在将此变量传递给@recipients 参数

EXECUTE msdb.dbo.sp_send_dbmail  @profile_name = 'ProfileName'  
                               , @recipients   = @Email_List
                               , @subject      = 'Some_Subject'
于 2014-02-25T20:48:16.887 回答