FOR XML PATH( ''):摆脱“特”字
-
20-08-2019 - |
题
此代码转换基本上在一个字符串中基于位置的字符在另一个字符串相同的位置处的字符,它运行在表中的所有行。
当运行此(简化版本):
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
不隶属于 StackOverflow