【问题标题】:HTML formatting only being partially applied using FOR XML PATH and sp_send_dbmail仅使用 FOR XML PATH 和 sp_send_dbmail 部分应用 HTML 格式
【发布时间】:2015-03-04 00:31:18
【问题描述】:

我有一个 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 发送的内容

注意&lt;br /&gt; 是如何成功“应用”到FOR XML PATH... 之外但在其中的区域,以文字形式编写的。

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

【问题讨论】:

  • 试试这个:SET @accountList = STUFF((SELECT ' &lt;br /&gt; ' + acct FROM @table FOR XML PATH(''), type).value('(./text())[1]','varchar(max)'),1,1,'')
  • @wewestthemenace 有效!如果你把它作为一个答案我会这样标记它,但你能否也提供一些信息为什么一个比另一个更有效?

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


【解决方案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 实体化方面存在问题,因为它将&lt;&gt; 和其他一些特殊字符转换为 XML 安全实体。使用PATH, TYPE).value() 可以防止这种情况发生。

【讨论】:

  • 很有趣 - 我没想到要打印 @accountList 来查看字面值是什么,感谢您的解释 :)
  • 没问题。很高兴我能帮上忙。
猜你喜欢
  • 1970-01-01
  • 2018-10-08
  • 1970-01-01
  • 2017-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-21
相关资源
最近更新 更多