Spe*_*son 4 xml t-sql sql-server xhtml for-xml
使用FOR XML PATH编码我的 HTML 使我的超链接毫无用处。我看到其他人正在使用value方法来防止编码。然而,这去掉了我需要的表结构。我可以进行搜索替换,有效地解码 html。这似乎不是正确的做法。
此查询中的 Company 列是有问题的子项:
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
Run Code Online (Sandbox Code Playgroud)
要点是:XML 不是带有一些额外字符的文本!
XML 中的文本不得携带标记所需的字符,尤其是三个邪恶字符:<>&。您不是将 XML 添加到输出中,而是添加一个看起来像 XML 的字符串。引擎做了必须做的事情:这个字符串被编码。
解决方法:您必须传递 XML 而不是字符串。
尝试更换这一行
, td = N'<a href="' + Website + '">' + Company + N'</a>', ''
Run Code Online (Sandbox Code Playgroud)
有了这个
,td = (SELECT Website AS [a/@href],Company AS a FOR XML PATH(''),TYPE)
Run Code Online (Sandbox Code Playgroud)
不知道这是否对您有帮助,但在这里您将找到一个通用函数,它将直接从语句创建一个带有标题和正文的 XHTML 表SELECT。
...FOR XML PATH(''),TYPE).value('.', 'VARCHAR(MAX)'),1,1,'')
Run Code Online (Sandbox Code Playgroud)
这.value('.', 'varchar(max)')在很多情况下都很有用。
| 归档时间: |
|
| 查看次数: |
3057 次 |
| 最近记录: |