Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

FOR XML PATH('') :caractères spéciaux d'échappement

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