XML du får är korrekt. Det är XML , inte text, och läsbar som XML av en XML-tolkare. Specialtecken är korrekt escaped, som de ska vara. Vilken klientmodul du än har som förbrukar den XML bör den analysera den som XML, inte som text, och sedan kommer den att visas korrekt.
Uppdatering:
Om fallet inte är klart, allt du behöver göra i din fråga är att behandla XML som XML och text som text, inte blanda XML som text, dvs:
;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