【问题标题】:FOR XML PATH(''): Escaping "special" charactersFOR XML PATH(''):转义“特殊”字符
【发布时间】:2009-06-26 21:30:40
【问题描述】:

此代码基本上将基于一个字符串中位置的字符转换为另一个字符串中相同位置的字符,并针对表中的所有行运行。

当我运行这个(简化版)时:

DECLARE @R           char(40)
DECLARE @U           char(40)
SET @R=' abcdefghijklmnopqrstuvwxyz!@#$%^&*()_+'+char(181)
SET @U=REVERSE(@R)

DECLARE @TestTable TABLE (RowID int identity(1,1) primary key, Unreadable  varchar(500))
INSERT INTO @TestTable VALUES ('+µt$zw!*µsu+yt!+s$xy')
INSERT INTO @TestTable VALUES ('%*!!xµpxu!(')
INSERT INTO @TestTable VALUES ('pxpµnxrµu+yµs%$t')


    ;WITH CodeValues AS
    (
    SELECT
        Number,SUBSTRING(@R,Number,1) AS R,ASCII(SUBSTRING(@U,Number,1)) AS UA
        FROM Numbers
        WHERE Number<=LEN(@R)
    )
    SELECT
        t.RowID
            ,(SELECT
                  ''+c.R
                  FROM Numbers               n
                      INNER JOIN CodeValues  c ON ASCII(SUBSTRING(t.Unreadable,n.Number,1))=c.UA
                  WHERE n.Number<=LEN(t.Unreadable) 
                  FOR XML PATH('') 
             ) AS readable
        FROM @TestTable t

我得到以下信息:

RowID       readable
----------- ---------------------------------------
1           a&#x20;simple&#x20;translation
2           hello&#x20;world
3           wow&#x20;you&#x20;ran&#x20;this

但需要:

RowID       readable
----------- ---------------------------------------
1           a simple translation
2           hello world
3           wow you ran this

除了REPLACE(),还有什么方法可以让空格正确显示吗?在我的实际代码中,这也发生在换行符上。

这可以用更好的方式重写吗?我基本上只是使用FOR XML PATH('') 将各个行值连接在一起。

【问题讨论】:

  • 我确定这是你的真实代码,但你真的应该发布一个更简单的例子来说明同样的问题。尽管问题可能要简单得多,但要消化大量奇怪的代码。
  • @John Saunders,我希望那是我的“真正的代码”,因为我现在已经完成了!很抱歉,最终代码会更复杂,因为这是一个查询的一小部分。

标签: sql-server tsql sql-server-2005 for-xml-path


【解决方案1】:

你得到的 XML 是正确的。它是 XML,而不是文本,并且可以被 XML 解析器作为 XML 读取。特殊字符被正确转义,因为它们应该是。无论您使用何种客户端模块使用 XML,都应将其解析为 XML,而不是文本,然后才能正确显示。

更新:

如果不清楚,你在查询中需要做的就是把XML当作XML,把文本当作文本,而不是把XML当作文本混合,即:

;WITH CodeValues AS
    (
    SELECT
        Number,SUBSTRING(@R,Number,1) AS R,ASCII(SUBSTRING(@U,Number,1)) AS UA
        FROM Numbers
        WHERE Number<=LEN(@R)
    )
, XmlValues AS (
SELECT
        t.RowID
            ,(SELECT
                  ''+c.R
                  FROM Numbers               n
                      INNER JOIN CodeValues  c ON ASCII(SUBSTRING(t.Unreadable,n.Number,1))=c.UA
                  WHERE n.Number<=LEN(t.Unreadable) 
                  FOR XML PATH(''), TYPE
             ) AS readable
        FROM @TestTable t)
SELECT x.RowId,
    x.readable.value('.', 'VARCHAR(8000)') as readable
    FROM XmlValues AS x

【讨论】:

猜你喜欢
  • 2014-06-02
  • 1970-01-01
  • 1970-01-01
  • 2018-12-14
  • 2019-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多