Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

FOR XML PATH(''):caracteres especiais de escape


O XML que você obtém está correto. É XML , não texto e legível como XML por um analisador XML. Caracteres especiais são escapados corretamente, como deveriam ser. Qualquer que seja o módulo de cliente que você tenha que consuma esse XML, deve analisá-lo como XML, não como texto, e então ele será exibido corretamente.

Atualizar:

Caso não esteja claro, tudo que você precisa fazer em sua consulta é tratar XML como XML e texto como texto, não misturar XML como texto, ou seja:
;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