2009-06-26 27 views
14

Questo codice traduce fondamentalmente i caratteri in base alla posizione in una stringa sul carattere nella stessa posizione in un'altra stringa e viene eseguito per tutte le righe nella tabella.PER PERCORSO XML (''): escape caratteri "speciali"

Quando ho eseguito questo (versione semplificata):

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 

ottengo il seguente:

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

Ma necessità:

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

Esiste un modo, diverso da REPLACE() , per visualizzare correttamente gli spazi? Questo succede anche in caso di interruzioni di linea, nel mio codice attuale.

Questo può essere riscritto in un modo migliore? Fondamentalmente ho usato lo FOR XML PATH('') per concatenare insieme i singoli valori di riga.

+0

I Sono certo che questo è il tuo vero codice, ma dovresti pubblicare un esempio più semplice che mostri lo stesso problema. È una quantità ragionevole di codice strano da digerire, sebbene il problema sia molto più semplice. –

+0

@John Saunders, vorrei che fosse il mio "vero codice", perché avrei finito adesso! Mi dispiace dire che il codice finale sarà più complesso, in quanto si tratta di una piccola parte di una query. –

risposta

22

L'XML che ottieni è corretto. È XML, non di testo e leggibile come XML da un parser XML. I personaggi speciali sono debitamente scappati, come dovrebbero essere. Qualunque sia il modulo client che consuma, XML dovrebbe analizzarlo come XML, non come testo, e quindi verrà visualizzato correttamente.

Aggiornamento:

Nel caso in cui non è chiaro, tutto quello che dovete fare nella query è per il trattamento di XML come XML e testo come testo, non mescolare XML come testo, vale a dire:

;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

funziona perfettamente! Grazie! –

+2

+1: questa risposta mi ha aiutato. Però mi sono perso il ', TYPE' per un po '. –

+0

Ho perso anche TYPE. Grazie per segnalarlo. +1 – rageit

Problemi correlati