Pregunta

Básicamente, este código traduce caracteres según la 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.

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
                  ''+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

Obtengo lo siguiente:

RowID       readable
----------- ---------------------------------------
1           a&#x20;simple&#x20;translation
2           hello&#x20;world
3           wow&#x20;you&#x20;ran&#x20;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 sucede en los saltos de línea, en mi código real.

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

¿Fue útil?

Solución

El código XML que se obtiene es correcta. Es XML , no de texto, y legible como XML mediante un analizador XML. Los caracteres especiales se escaparon adecuadamente, como debe ser. Cualquiera que sea módulo cliente tiene que consume XML que se debe analizar 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, no mezcle 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top