POUR XML PATH ( ''): Échapper caractères « spéciaux »
-
20-08-2019 - |
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 simple translation
2 hello world
3 wow you ran 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.
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