此代码基本上将一个字符串中基于位置的字符转换为另一个字符串中相同位置的字符,并且它针对表中的所有行运行。
当我运行这个(简化版本)时:
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 simple translation
2 hello world
3 wow you ran 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,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
关于sql-server - 对于 XML 路径 ('' ) : Escaping "special" characters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1051362/