您如何使用 MS SQL 中的 dbmail 向具有不同标准的多个人发送电子邮件
How do you send emails to multiple people, with different criteria, using dbmail in MS SQL
我正在构建以下 SQL 查询,以向不同的人发送自动电子邮件。现在,我已将其设置为通过电子邮件将 table 发送给一个人。
我想做的是根据条件将特定的查询结果发送给特定的人。例如,我想发送一封仅包含 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' ;
您可以使用 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
我正在构建以下 SQL 查询,以向不同的人发送自动电子邮件。现在,我已将其设置为通过电子邮件将 table 发送给一个人。
我想做的是根据条件将特定的查询结果发送给特定的人。例如,我想发送一封仅包含 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' ;
您可以使用 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