Le XML que vous obtenez est correct. C'est XML , pas de texte, et lisible en XML par un analyseur XML. Les caractères spéciaux sont correctement échappés, comme il se doit. Quel que soit le module client que vous avez et qui consomme ce XML, il doit l'analyser comme du XML, et non comme du texte, puis il s'affichera correctement.
Mise à jour :
Si ce n'est pas clair, tout ce que vous avez à faire dans votre requête est de traiter XML comme XML et le texte comme texte, et non de mélanger XML comme texte, c'est-à-dire :
;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