FOR XML PATH (”): caracteres “especiales” que escapan

Este código básicamente traduce los caracteres basados ​​en la posición en una cadena al personaje en la misma posición en otra cadena y se ejecuta para todas las filas de la tabla.

Cuando ejecuto esto (versión simplificada):

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,Number,1)) AS UA FROM Numbers WHERE Number<=LEN(@R) ) SELECT t.RowID ,(SELECT ''+cR 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 

Obtengo lo siguiente:

 RowID readable ----------- --------------------------------------- 1 a simple translation 2 hello world 3 wow you ran this 

Pero necesito

 RowID readable ----------- --------------------------------------- 1 a simple translation 2 hello world 3 wow you ran this 

¿Hay alguna manera, aparte de REPLACE() , para que los espacios se muestren correctamente? Esto también ocurre en saltos de línea, en mi código real.

¿Puede esto ser reescrito de una mejor manera? Básicamente, utilicé FOR XML PATH('') para concatenar los valores de fila individuales juntos.

El XML que obtienes es correcto. Es XML , no texto, y legible como XML por un analizador XML. Los personajes especiales se escapan adecuadamente, como deberían ser. Cualquiera que sea el módulo de cliente que tenga, ese XML debería analizarlo como XML, no como texto, y luego se mostrará correctamente.

Actualizar:

En caso de que no esté claro, todo lo que necesita hacer en su consulta es tratar XML como XML y texto como texto, no mezclar XML como texto, es decir:

 ;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 ''+cR 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 
    Intereting Posts