Frage

Dieser Code übersetzt grundsätzlich Zeichen basierend auf Position in einer Zeichenfolge zu dem Zeichen an der gleichen Position in einem anderen String und es läuft für alle Zeilen in der Tabelle.

Wenn ich ausführen, um diese (vereinfachte Version):

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

ich wie folgt vor:

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

Aber Notwendigkeit:

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

Gibt es eine Möglichkeit, andere als REPLACE(), haben die Räume richtig angezeigt? Dies geschieht auch auf Zeilenumbrüche in meinem eigentlichen Code.

Kann dies in einer besseren Art und Weise neu geschrieben werden? Ich im Grunde verwenden nur die FOR XML PATH('') der einzelnen Zeilenwerte zusammen zu verketten.

War es hilfreich?

Lösung

Die XML Sie erhalten, ist richtig. Es ist XML , nicht Text und lesbar als XML durch einen XML-Parser. Sonderzeichen werden richtig entkommen, wie sie sein sollten. Ganz gleich, welches Client-Modul, das Sie haben, dass verbraucht, dass XML als XML analysieren sollte, nicht als Text, und dann wird es richtig angezeigt.

Update:

Falls nicht klar ist, alles, was Sie brauchen in Ihrer Abfrage zu tun ist, XML als XML und Text als Text zu behandeln, nicht XML als Text mischte, dh:

;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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top