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 simple translation
2 hello world
3 wow you ran 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.
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. –
@ 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. –