2009-06-26 33 views
14

Este código básicamente traduce los caracteres basados ​​en posición en una cadena al carácter en la misma posición en otra cadena y se ejecuta para todas las filas de la tabla.FOR XML PATH (''): caracteres "especiales" que escapan

Cuando ejecuto esto (versión simplificada):

DECLARE @R   char(40) 
DECLARE @U   char(40) 
SET @R=' [email protected]#$%^&*()_+'+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 
        ''+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('') 
      ) AS readable 
     FROM @TestTable t 

consigo el siguiente:

RowID  readable 
----------- --------------------------------------- 
1   a&#x20;simple&#x20;translation 
2   hello&#x20;world 
3   wow&#x20;you&#x20;ran&#x20;this 

Pero necesidad:

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

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

¿Se puede reescribir esto de una mejor manera? Básicamente, utilicé el FOR XML PATH('') para concatenar los valores de fila individuales.

+0

I Estoy seguro de que este es tu código real, pero realmente deberías publicar un ejemplo más simple que ilustre el mismo problema. Es una gran cantidad de códigos extraños para digerir, aunque es probable que el problema sea mucho más simple. –

+0

@ John Saunders, ¡ojalá fuera mi "código real", porque ya estaría hecho! Lamento decir que el código final será más complejo, ya que esta es una pequeña parte de una consulta. –

Respuesta

22

El XML que recibe 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.

Actualización:

En caso de que no está claro, todo lo que necesita hacer en su consulta es para el tratamiento de XML como XML y texto como texto, se mezcla 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 
        ''+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 
+1

funciona a la perfección! ¡Gracias! –

+2

+1 - esta respuesta solo me ayudó. Me perdí el ', TYPE' por un tiempo, sin embargo. –

+0

Extraño TIPO también. Gracias por mencionarlo. +1 – rageit

Cuestiones relacionadas