【问题标题】:How can I avoid character encoding when using "FOR XML PATH" without REPLACE function在没有 REPLACE 功能的情况下使用“FOR XML PATH”时如何避免字符编码
【发布时间】: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

标签: sql-server xml path


【解决方案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?
猜你喜欢
  • 2013-03-16
  • 2017-03-10
  • 2021-09-08
  • 1970-01-01
  • 2023-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-11
相关资源
最近更新 更多