0

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

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

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 />的区域的成功“应用”是如何写为文字的。FOR XML PATH...

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

4

1 回答 1

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

于 2015-03-04T01:24:10.090 回答