在没有 REPLACE 功能的情况下使用“FOR XML PATH”时如何避免字符编码
Posted
技术标签:
【中文标题】在没有 REPLACE 功能的情况下使用“FOR XML PATH”时如何避免字符编码【英文标题】:How can I avoid character encoding when using "FOR XML PATH" without REPLACE function 【发布时间】:2022-01-07 02:10:07 【问题描述】:使用 FOR XML PATH 对我的 html 进行编码,使超链接无用。 我看到其他人正在使用 value 方法来防止编码。但这去掉了我需要的表结构。 我想避免使用 REPLACE 功能 SQL Server 2016
我期待这个结果:
<td>
<a href="https://backend.com/User/UserDetails.aspx?UserID=1">1</a>
</td>
<td>Ann</td>
<td>GB</td>
</tr>
<tr>
<td>
<a href="https://backend.com/User/UserDetails.aspx?UserID=2">2</a>
</td>
<td>Jason</td>
<td>DE</td>
</tr>
<tr>
<td>
<a href="https://backend.com/User/UserDetails.aspx?UserID=3">3</a>
</td>
<td>Mary</td>
<td>PT</td>
</tr>
CREATE TABLE #History (UserID int, UserName Varchar(20), CountryName Varchar(2))
Insert into #History
Values(1,'Ann', 'GB'),
(2,'Jason', 'DE'),
(3,'Mary', 'PT')
select * from #History
DECLARE @Values NVARCHAR(MAX)
SELECT @Values = CAST((SELECT '<a href="https://backend.com/User/UserDetails.aspx?UserID='
++ CAST(UserId AS varchar(150)) ++ '">'
++ CAST(UserID AS varchar(150)) ++ '</a>' AS 'td','',UserName AS 'td','',CountryName AS 'td',''
FROM #History
FOR XML PATH('tr'), ELEMENTS ) AS NVARCHAR(MAX))
SELECT @Values
【问题讨论】:
仅供参考,在发布 DML 时,您也必须为表格发布DDL
。
【参考方案1】:
你需要嵌套你的 XML:
SELECT @Values = CAST((SELECT (SELECT CONCAT('https://backend.com/User/UserDetails.aspx?UserID',UserId) AS [@href] FOR XML PATH('a'),TYPE) AS td,'',
UserName AS td,'',
CountryName AS td,''
FROM #History
FOR XML PATH('tr'), ELEMENTS) AS NVARCHAR(MAX));
这会导致:
<tr>
<td>
<a href="https://backend.com/User/UserDetails.aspx?UserID1" />
</td>
<td>Ann</td>
<td>GB</td>
</tr>
<tr>
<td>
<a href="https://backend.com/User/UserDetails.aspx?UserID2" />
</td>
<td>Jason</td>
<td>DE</td>
</tr>
<tr>
<td>
<a href="https://backend.com/User/UserDetails.aspx?UserID3" />
</td>
<td>Mary</td>
<td>PT</td>
</tr>
基于新的预期结果:
SELECT (SELECT CONCAT('https://backend.com/User/UserDetails.aspx?UserID', UserId) AS [a/@href],
UserId AS [a]
FOR XML PATH(''), TYPE) AS td,
'',
UserName AS td,
'',
CountryName AS td,
''
FROM #History
FOR XML PATH('tr'), ELEMENTS;
--or
SELECT CONCAT('https://backend.com/User/UserDetails.aspx?UserID', UserId) AS [td/a/@href],
UserId AS [td/a],'',
UserName AS td,
'',
CountryName AS td,
''
FROM #History
FOR XML PATH('tr'), ELEMENTS;
这给出了:
<tr>
<td>
<a href="https://backend.com/User/UserDetails.aspx?UserID1">1</a>
</td>
<td>Ann</td>
<td>GB</td>
</tr>
<tr>
<td>
<a href="https://backend.com/User/UserDetails.aspx?UserID2">2</a>
</td>
<td>Jason</td>
<td>DE</td>
</tr>
<tr>
<td>
<a href="https://backend.com/User/UserDetails.aspx?UserID3">3</a>
</td>
<td>Mary</td>
<td>PT</td>
</tr>
【讨论】:
@Zorge17,我看不懂。我根据您的尝试得出了结果。如果您在问题中提供预期结果,那将更加有用。 我已经添加了预期的结果,如果你能提供帮助,我将非常感激 怎么样,@Zorge17?以上是关于在没有 REPLACE 功能的情况下使用“FOR XML PATH”时如何避免字符编码的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用 CONFLICT_REPLACE 的情况下获得“插入或更新”行为?
如何在没有 Confluent 的情况下使用 Kafka Connect for Cassandra
如何在没有 ConcurrentModificationException 的情况下使用 for-each 循环进行迭代时修改集合? [复制]