该代码基本上将基于一个字符串中的位置的字符转换为另一个字符串中位于相同位置的字符,并为表中的所有行运行.
当我运行这个(简化版):
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 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,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