加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql-server – FOR XML PATH(”):转义“特殊”字符

发布时间:2020-12-12 16:30:49 所属栏目:MsSql教程 来源:网络整理
导读:该代码基本上将基于一个字符串中的位置的字符转换为另一个字符串中位于相同位置的字符,并为表中的所有行运行. 当我运行这个(简化版): DECLARE @R char(40)DECLARE @U char(40)SET @R=' abcdefghijklmnopqrstuvwxyz!@#$%^*()_+'+char(181)SET @U=REVERSE(@R)D
该代码基本上将基于一个字符串中的位置的字符转换为另一个字符串中位于相同位置的字符,并为表中的所有行运行.

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

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,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(”)将各个行值连接在一起.

解决方法

你得到的XML是正确的. XML解析器是XML,而不是文本,可读取为XML.特殊字符应该被正确地逃脱.无论客户端模块使用哪种消费XML应该将其解析为XML,然后它将正确显示.

更新:

如果不清楚,您在查询中需要执行的所有操作都是将XML作为XML和文本视为文本,而不是将XML作为文本混合,即:

;WITH CodeValues AS
    (
    SELECT
        Number,1)) AS UA
        FROM Numbers
        WHERE Number<=LEN(@R)
    ),XmlValues AS (
SELECT
        t.RowID,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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读