0

我编写了一个每天运行的存储过程,并发现由于支票信息不足而我们无法处理的支票。此查询的结果为我提供了一个包含 4 列的表,其中之一是电子邮件地址,其他三列是未处理支票的支票信息。
CHECK_AMT | CHECK_DATE | 客户名称 | 电子邮件地址

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

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

4

2 回答 2

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;

您可能可以稍微清理一下循环以避免使查询加倍,但是您明白了……

于 2013-11-12T15:48:50.903 回答
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;

这假定数据库邮件已配置并且您希望从默认配置文件发送邮件。 有关更多信息,请参阅文档sp_send_dbmail

于 2013-11-12T16:02:55.287 回答