仅使用FOR XML PATH和sp_send_dbmail部分应用HTML格式

时间:2015-03-04 00:31:18

标签: sql-server sql-server-2008 sp-send-dbmail for-xml-path

我有一个SP,用于识别和删除不再需要的旧数据库信息,编译已删除的帐户列表。

我发送的电子邮件中包含这些帐户的列表,但出于某种原因,HTML格式仅应用于邮件正文的某个部分,是否有人可以提供此问题的原因/解决方案?< / p>

DECLARE @table TABLE (acct varchar(4))
INSERT INTO @table (acct)
SELECT 1234
UNION ALL SELECT 2345
UNION ALL SELECT 3456
UNION ALL SELECT 4567

DECLARE @accountList VARCHAR(MAX)
SET @accountList = 
    STUFF((SELECT ' <br /> ' + acct FROM @table FOR XML PATH('')),1,1,'')

DECLARE @mailBody VARCHAR(MAX)
SELECT  @mailBody = 'The job ran successfully.' +
    '<br /><br />Account List Purged: <br />' + @accountList

EXEC msdb.dbo.sp_send_dbmail
    @profile_name = 'Default',
    @recipients = 'email@email.email',
    @subject = 'Data Purge [Accounts Purged]',
    @body_format = 'html',
    @body = @mailBody

以下是exec msdb.dbo.sp_send_dbmail

发送的内容

enter image description here

注意<br />成功&#34;如何应用&#34;对于FOR XML PATH...以外的区域,但在其中,则写为文字。

任何人都有这方面的经验和/或知道我需要做些什么来修复?

1 个答案:

答案 0 :(得分:1)

您应该使用FOR XML PATH(''), type).value('.[1]','nvarchar(max)')

SET @accountList = 
    STUFF((
        SELECT ' <br /> ' + acct 
        FROM @table FOR XML PATH(''), type).value('.[1]','nvarchar(max)'),
    1, 1, '')

打印:

<br /> 1234 <br /> 2345 <br /> 3456 <br /> 4567

您的查询打印时:

&lt;br /&gt; 1234 &lt;br /&gt; 2345 &lt;br /&gt; 3456 &lt;br /&gt; 4567

FOR XML PATH('')在XML授权方面存在问题,因为它会将<>和其他一些特殊字符转换为XML安全实体。使用PATH, TYPE).value()可以防止这种情况发生。