Question

Ce code se traduit essentiellement des caractères en fonction de la position dans une chaîne au caractère à la même position dans une autre chaîne et il fonctionne pour toutes les lignes du tableau.

Quand je lance cette (version simplifiée):

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

Je reçois le texte suivant:

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

Mais besoin:

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

Est-il possible, autre que REPLACE(), d'avoir les espaces apparaissent correctement? Cela se produit également sur les sauts de ligne, dans mon code actuel.

Peut-on réécrite une meilleure façon? Je viens d'utiliser essentiellement la pour concaténer les FOR XML PATH('') valeurs des lignes individuelles ensemble.

Était-ce utile?

La solution

Le fichier XML que vous obtenez est correct. Il est XML , pas de texte, et lisible au format XML par un analyseur XML. Les caractères spéciaux sont correctement saisies, comme ils le devraient. Quel que soit le module client que vous avez consommatrice de ce XML devrait analyser comme XML, et non pas sous forme de texte, puis il affichera correctement.

Mise à jour:

Dans le cas est pas clair, tout ce que vous devez faire dans votre requête est de traiter XML comme XML et texte sous forme de texte, pas mélanger XML sous forme de texte, par exemple:

;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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top