使用" FOR XML PATH"?时,如何避免编码?

时间:2016-10-27 22:51:58

标签: sql-server xml tsql xhtml for-xml

使用FOR XML PATH对我的HTML进行编码,使我的超链接毫无用处。我看到others正在使用value方法来阻止编码。但是,这剥离了我需要的表格结构。我可以做一个搜索替换,有效地解码HTML。这似乎不是正确的做法。

此查询中的公司列是问题子项:

DECLARE @tableHTML NVARCHAR(MAX)
DECLARE @subj VARCHAR(255)

SET @tableHTML =
    N'<style type="text/css">' +
    N'table, td {border-collapse: collapse; vertical-align: top; text-align: left;font-family: Calibri; font-size: 12px;}' +
    N'th {vertical-align: middle; text-align: left;border-bottom-style: solid; border-bottom-width: 0px; border-bottom-color: #CCCCCC; background-color: #000000; color: #FFFFFF;}' +
    N'td {border-bottom-style: solid; border-bottom-width: 0px; border-bottom-color: #CCCCCC}' +
    N'</style>' +

    N'<h3 style="font-family: Calibri">Contacts:</h3>' +

    N'<table id="bodyTable" cellpadding="5" cellspacing="5" style="border: 1px solid #C0C0C0; vertical-align: top; text-align: left; height: 100%; width: 700;">' +
    N'  <tr>' +
    N'      <th>ContactID</th>' +
    N'      <th>FullName</th>' +
    N'      <th>Salutation</th>' +
    N'      <th>Company</th>' +
    N'      <th>Email</th>' +
    N'  </tr>' +

    CAST((
            SELECT td = nContactID, ''
                , td = FullName, ''
                , td = Salutation, ''
                , td = N'<a href="' + Website + '">' + Company + N'</a>', ''
                , td = Email, ''
            FROM vContact
            WHERE LastName = 'Jetson'

            FOR XML PATH('tr'), TYPE 
        ) AS NVARCHAR(MAX)) +
    N'          </table>'

    PRINT @tableHTML 

2 个答案:

答案 0 :(得分:3)

重点是: XML不是带有一些额外字符的文字!

XML 中的文字不得带有标记所需的字符,尤其是邪恶的三个字符:<>&。您不是将XML添加到输出中,而是添加一个字符串,看起来像XML一样。并且引擎会执行必须执行的操作:此字符串已编码。

路径:您必须移交XML而不是字符串。

尝试替换此行

, td = N'<a href="' + Website + '">' + Company + N'</a>', ''

用这个

,td = (SELECT Website AS [a/@href],Company AS a FOR XML PATH(''),TYPE)

更新

不知道这是否会对您有所帮助,但是here您会找到一个通用函数,该函数将直接从SELECT语句创建带有标题和正文的XHTML表。

答案 1 :(得分:0)

...FOR XML PATH(''),TYPE).value('.', 'VARCHAR(MAX)'),1,1,'')

.value('.', 'varchar(max)')在很多情况下都很有用。