如何使用MS SQL中的dbmail以不同的标准向多人发送电子邮件

时间:2015-04-09 19:37:11

标签: sql-server sp-send-dbmail

我正在构建以下SQL查询,以便向各种人发送自动电子邮件。现在我已将它设置为通过电子邮件将表格发送给一个人。

我想要做的是根据条件将特定查询结果发送给特定人员。例如,我想发送一封电子邮件,其中只包含SC = 20到abc@email.com的数据,另一封电子邮件,其中sc = 30到xyz@email.com。

此外,如果没有该特定SC的数据,那么我就不会向他们发送电子邮件。

如何调整以适应这种情况?我很感激任何反馈。谢谢。

use DST14000BUSD

DECLARE @tableHTML  NVARCHAR(MAX) ;

SET @tableHTML =
    N'<H1>Data Issues</H1>' +
    N'<p>This is an automated email. Please review and correct these issues as soon as possible. Thank you.</p>' +    
    N'<p>Periods in address or city field. Periods are not allowed in addresses because they are not supported by other systems.</p>' +  
    N'<table border="1">' +
    N'<tr><th>Issue</th><th>Status</th>' +
    N'<th>School</th><th>ID</th><th>Student #</th>' +
    N'<th>First Name</th><th>Last Name</th><th>Address</th><th>City</th><th>Residence Address</th><th>Residence City</th></tr>' +
    CAST ( ( SELECT td = 'Period in address or city field',       '',
                    td = TG, '', td = sc, '',
                    td = id, '', td = sn, '', td = fn, '', td = ln, '',
                    td = ad, '', td = cy, '', td = rad, '',
                    td = rcy
from stu
where ((AD like '%.%' or RAD like '%.%' or CY like '%.%' or RCY like '%.%')
or (AD like '%!%' or RAD like '%!%' or CY like '%!%' or RCY like '%!%'))
and DEL = 0
order by SC              

              FOR XML PATH('tr'), TYPE 
    ) AS NVARCHAR(MAX) ) +
    N'</table>' +

N'<p>Email processed on ' + CONVERT(VARCHAR(10),GETDATE(),101) + '</p>' ;    

EXEC msdb.dbo.sp_send_dbmail @recipients='email@email.com',
    @from_address = 'email@email.com',
    @subject = 'Data Issues',
    @body = @tableHTML,
    @body_format = 'HTML' ;

1 个答案:

答案 0 :(得分:2)

您可以使用CURSOR循环收件人。

DECLARE @tableHTML NVARCHAR(MAX),
        @Email NVARCHAR(255),
        @Code INT

-- test mapping table 
CREATE TABLE #map ( Email nvarchar(255), Code int   )
insert #map values ('abc@gmail.com', 20)
insert #map values  ('xyz@email.com', 30)

-- CURSOR to iterate through rows in #map
DECLARE mail_cursor CURSOR
FOR SELECT email, code FROM #map
OPEN mail_cursor        

-- Fetch the first row
FETCH NEXT FROM mail_cursor
INTO @Email, @Code

-- Check for successful fetch
WHILE (@@FETCH_STATUS = 0)
BEGIN

    -- Only proceed if there is data to send
    IF (EXISTS (select 1 FROM stu WHERE sc = @Code))
    BEGIN

        -- Build email body. Same as you have, but limit to sc=@code
        SET @tableHTML = N'..'

        -- send to #map.Email
        EXEC msdb.dbo.sp_send_dbmail @recipients=@Email,
            @from_address = 'email@email.com',
            @subject = 'Data Issues',
            @body = @tableHTML,
            @body_format = 'HTML' ;
    END

    -- Fetch the next row
    FETCH NEXT FROM mail_cursor
    INTO @Email, @Code
END

-- Cleanup
CLOSE mail_cursor
DEALLOCATE mail_cursor
DROP TABLE #map