使用 "FOR XML PATH" 时如何避免编码?
How can I avoid encoding when using "FOR XML PATH"?
使用 FOR XML PATH
编码我的 HTML 使我的超链接无用。我看到 others are using the value 方法来防止编码。但是,这去掉了我需要的 table 结构。我可以进行搜索替换,有效解码 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
关键是: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
声明。
...FOR XML PATH(''),TYPE).value('.', 'VARCHAR(MAX)'),1,1,'')
.value('.', 'varchar(max)')
在很多情况下很有用。
使用 FOR XML PATH
编码我的 HTML 使我的超链接无用。我看到 others are using the value 方法来防止编码。但是,这去掉了我需要的 table 结构。我可以进行搜索替换,有效解码 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
关键是: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
声明。
...FOR XML PATH(''),TYPE).value('.', 'VARCHAR(MAX)'),1,1,'')
.value('.', 'varchar(max)')
在很多情况下很有用。