SQL通过电子邮件将不同的行发送到不同的电子邮件地址

时间:2013-11-12 15:43:44

标签: sql-server-2008 email stored-procedures

我编写了一个每天运行的存储过程,并查找由于检查信息不足而无法处理的检查。此查询的结果为我提供了一个包含4列的表,其中一列是电子邮件地址,另外三列是未处理检查的检查信息。
CHECK_AMT | CHECK_DATE | CUSTOMER_NAME | EMAIL_ADDRESS

因此,每一行都有不同支票和/或不同客户的信息。我希望SQL向Mr / s发送电子邮件。 [EMAIL_ADDRESS]在每家公司[COMPANY_NAME]通知他们需要就$ [CHECK_AMT]的[CHECK_DATE]日期检查与我们联系。每个客户只能收到一封电子邮件,其中包含自己检查的信息,而不是存储过程生成的整个表格。

我查看了其他SQL生成的电子邮件,但还没找到以这种方式发送电子邮件的电子邮件。有关将第1行中的信息通过电子邮件发送到第1行中的电子邮件地址,从第2行发送到第2行中的电子邮件地址等信息的任何指导等等。我现在只用sql工作了大约3个星期,所以我对一切都很新。如果有人有任何问题,我很乐意回答。谢谢!

2 个答案:

答案 0 :(得分:0)

我在想你只需要某种循环。光标或while循环可能类似于:

declare @check_id int;
declare @email varchar(100);
declare @check_date date;
...etc...

while exists (select 1 from emails where ... and msg_sent = 0)
begin
    select top 1 @check_id = check_id, @email = email, @check_date = check_date, ...
    from emails
    where ... and msg_sent = 0;

    ' Now you've got variables which you can use to send your email

    update emails set msg_sent = 1
    where check_id = @check_id;
end;

你可以稍微清理一下循环以避免加倍查询,但是你明白了......

答案 1 :(得分:0)

DECLARE 
  @ch_amt DECIMAL(20,2), 
  @ch_date DATE, 
  @c_name NVARCHAR(255), 
  @email VARCHAR(320), 
  @msg NVARCHAR(MAX);

DECLARE c CURSOR LOCAL FAST_FORWARD FOR
  SELECT CHECK_AMT, CHECK_DATE, CUSTOMER_NAME, EMAIL_ADDRESS
  FROM dbo.SomeTable
  WHERE [some clause that lets you know this check was nOt processed];

OPEN c;

FETCH c INTO @ch_amt, @ch_date, @c_name, @email;

WHILE @@FETCH_STATUS = 0
BEGIN
  SET @msg = N'Dear ' + @c_name + ', we could not process your check...';

  EXEC msdb.dbo.sp_send_dbmail
    @recipients = @email,
    @subject = N'Check processing failure',
    @body = @msg;

  FETCH c INTO @ch_amt, @ch_date, @c_name, @email;
END

CLOSE c;
DEALLOCATE c;

这假设已配置数据库邮件,并且您要从默认配置文件发送邮件。 See the documentation for sp_send_dbmail for more info