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

HTML formatting only being partially applied using FOR XML PATH and sp_send_dbmail

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

我正在发送一封包含这些帐户列表的电子邮件,但由于某种原因,HTML 格式仅应用于邮件正文的一部分,任何人都可以提供 reason/solution 这个问题?

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

发送的内容

请注意 <br /> 如何成功地 "applied" 在 FOR XML PATH... 之外的区域,但在 FOR XML PATH... 之内,被写成文字。

任何人对此有任何经验and/or知道我需要做什么来补救吗?

你应该使用 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() 可以防止这种情况发生。