通过T-SQL中的电子邮件发送数据

时间:2010-11-15 15:28:54

标签: sql sql-server sql-server-2005 tsql

我正在编写一个存储过程,它收集在给定日期的表中发生的所有更改,并希望通过SQL Batch Job的电子邮件将记录集发送给管理员。

现在直到现在,我无法弄清楚如何在电子邮件正文中发送记录集。是否可以根据从某些tsql逻辑获得的记录集构建电子邮件正文。

任何帮助都是适当的

由于

TheITGuy

3 个答案:

答案 0 :(得分:2)

查看sp_send_dbmail过程,该过程允许您执行查询并将结果发送到电子邮件正文或作为文件附件。

答案 1 :(得分:0)

这可能会为你提供一些动力:

CREATE TABLE #Temp 
( 
  [Rank]  [int],
  [Player Name]  [varchar](128),
  [Ranking Points] [int],
  [Country]  [varchar](128)
)


INSERT INTO #Temp
SELECT 1,'Rafael Nadal',12390,'Spain'
UNION ALL
SELECT 2,'Roger Federer',7965,'Switzerland'
UNION ALL
SELECT 3,'Novak Djokovic',7880,'Serbia'


DECLARE @xml NVARCHAR(MAX)
DECLARE @body NVARCHAR(MAX)


SET @xml = CAST(( SELECT [Rank] AS 'td','',[Player Name] AS 'td','',
       [Ranking Points] AS 'td','', Country AS 'td'
FROM  #Temp ORDER BY Rank 
FOR XML PATH('tr'), ELEMENTS ) AS NVARCHAR(MAX))


SET @body ='<html><body><H3>Tennis Rankings Info</H3>
<table border = 1> 
<tr>
<th> Rank </th> <th> Player Name </th> <th> Ranking Points </th> <th> Country </th></tr>'    


SET @body = @body + @xml +'</table></body></html>'


EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'SQL ALERTING', -- replace with your SQL Database Mail Profile 
@body = @body,
@body_format ='HTML',
@recipients = 'bruhaspathy@hotmail.com', -- replace with your email address
@subject = 'E-mail in Tabular Format' ;


DROP TABLE #Temp

答案 2 :(得分:0)

我工作的公司要求名称/值对位于不同的行而不是表格中。虽然我的解决方案可以使用一些调整,但经过大量工作后,我想出了一个带有css格式的解决方案。我无法弄清楚为什么NA​​ME列的宽度不是100px,正如我所要求的那样。

特殊字符是&lt; alt&gt; +0182,&lt; alt&gt; +0183和&lt; alt&gt; +0185。

如果没有这么多替换功能,我将继续努力寻求更优雅的解决方案,但公司更关注的是“现在”的解决方案,而不是优雅的解决方案。反馈/改进将不胜感激。

电子邮件到达(在Outlook中)格式化,这是我们公司的偏好:


网球排名信息

等级:1
球员姓名:Rafael Nadal
积分:12390
国家:西班牙

等级:2
球员姓名:Roger Federer
积分:7965
国家:瑞士

等级:3
球员姓名:诺瓦克·德约科维奇 积分:7880
国家:塞尔维亚


这是我的解决方案:

    CREATE TABLE #Temp 
( 
  [Rank]  [int],
  [Player Name]  [varchar](128),
  [Ranking Points] [int],
  [Country]  [varchar](128)
)

INSERT INTO #Temp
SELECT 1,'Rafael Nadal',12390,'Spain'
UNION ALL
SELECT 2,'Roger Federer',7965,'Switzerland'
UNION ALL
SELECT 3,'Novak Djokovic',7880,'Serbia'

DECLARE @xml NVARCHAR(MAX)
DECLARE @body NVARCHAR(MAX)

SET @xml = CAST(( SELECT '¶Rank:·º' + convert(varchar, [Rank]) AS 'br','','¶Player Name:·º' +[Player Name] AS 'br','',
      '¶Points:·º' + convert(varchar, [Ranking Points]) AS 'br','', '¶Country:·º' + Country AS 'br'
FROM  #Temp ORDER BY Rank 
FOR XML PATH('br'), ELEMENTS ) AS NVARCHAR(MAX))

SET @body ='<html><head><style type=''text/css''>body{font-family:tahoma;font-size:9pt;}.h{width:100px;}</style></head><body><H3>Tennis Rankings Info</H3>'    

SET @body = @body + @xml +'</body></html>'
set @body = replace(@body, '</br>', '<br />')
set @body = replace(@body, '<br><br>', '<p>')
set @body = replace(@body, '<br>', '')
set @body = replace(@body, '<br /><br />', '</p>')
set @body = replace(@body, '¶', '<span class=''h''>')
set @body = replace(@body, '·', '</span>')
set @body = replace(@body, 'º', '&nbsp;&nbsp;')

--select @body

EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'DBMail', -- replace with your SQL Database Mail Profile 
@body = @body,
@body_format ='HTML',
@recipients = 'xxx@xxx.com', -- replace with your email address
@subject = 'E-mail in Tabular Format' ;

DROP TABLE #Temp