2009-06-26 3 views
14

Этот код в основном преобразует символы, основанные на позиции в одной строке, на символ в том же положении в другой строке и выполняется для всех строк в таблице.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&#x20;simple&#x20;translation 
2   hello&#x20;world 
3   wow&#x20;you&#x20;ran&#x20;this 

Но потребность:

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

Есть ли способ, кроме REPLACE() , чтобы пробелы отображались правильно? Это также происходит при разрыве строк в моем фактическом коде.

Можно ли это переписать лучше? Я просто использовал FOR XML PATH(''), чтобы объединить отдельные значения строк вместе.

+0

I «Конечно, это ваш настоящий код, но вы действительно должны опубликовать более простой пример, иллюстрирующий ту же проблему. Это довольно много странного кода для переваривания, хотя проблема, вероятно, будет намного проще. –

+0

@ Джон Сандерс, мне жаль, что это был мой «настоящий код», потому что я бы сделал это сейчас! Извините, что последний код будет более сложным, так как это небольшая часть одного запроса. –

ответ

22

XML, который вы получаете, верен. Это XML, а не текст и читается как XML парсером XML. Специальные символы правильно экранируются, как и должно быть. Независимо от того, какой клиентский модуль у вас есть, этот XML должен анализировать его как XML, а не как текст, а затем отображать его правильно.

Update:

В случае не ясно, все, что вам нужно сделать в запросе, чтобы обработать XML как XML и текст как текст, а не смешивать XML как текст, то есть:

;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

отлично работает! благодаря! –

+2

+1 - этот ответ мне просто помог. Тем не менее, я пропустил ', TYPE'. –

+0

Я тоже пропустил ТИП. Спасибо, что указали это. +1 – rageit

Смежные вопросы