Этот код в основном преобразует символы, основанные на позиции в одной строке, на символ в том же положении в другой строке и выполняется для всех строк в таблице.FOR XML PATH (''): Escaping «специальные» символы
Когда я запускаю этот (упрощенный вариант):
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
я получаю следующее:
RowID readable
----------- ---------------------------------------
1 a simple translation
2 hello world
3 wow you ran this
Но потребность:
RowID readable
----------- ---------------------------------------
1 a simple translation
2 hello world
3 wow you ran this
Есть ли способ, кроме REPLACE()
, чтобы пробелы отображались правильно? Это также происходит при разрыве строк в моем фактическом коде.
Можно ли это переписать лучше? Я просто использовал FOR XML PATH('')
, чтобы объединить отдельные значения строк вместе.
I «Конечно, это ваш настоящий код, но вы действительно должны опубликовать более простой пример, иллюстрирующий ту же проблему. Это довольно много странного кода для переваривания, хотя проблема, вероятно, будет намного проще. –
@ Джон Сандерс, мне жаль, что это был мой «настоящий код», потому что я бы сделал это сейчас! Извините, что последний код будет более сложным, так как это небольшая часть одного запроса. –