エスケープ「特別な」文字:XMLのPATH( '')FOR
-
20-08-2019 - |
質問
このコードは、基本的には、別の文字列内の同じ位置にある文字を1つの文字列内の位置に基づいて文字を変換し、それが表内のすべての行で実行されます。
私はこの(簡易版)を実行する場合:
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
私は、次の取得ます:
RowID readable
----------- ---------------------------------------
1 a simple translation
2 hello world
3 wow you ran this
しかし必要があります。
RowID readable
----------- ---------------------------------------
1 a simple translation
2 hello world
3 wow you ran this
どのような方法は、スペースが正しく表示持つように、REPLACE()
以外、ありますか?また、これは私の実際のコードでは、改行で発生します。
これは良い方法で書き換えることはできますか?私は基本的には一緒に、個々の行の値を連結するFOR XML PATH('')
を使用する。
解決
あなたが得るXMLは正しいです。これは、の XML のではなく、テキスト、XMLパーサによってXMLとして読み取り可能です。彼らはあるべきなどの特殊文字が正しくエスケープされています。どのようなクライアントモジュールあなたはそれがXMLではないテキストとして、XMLとしてそれを解析する必要があり、それが正しく表示されますことを消費しています。
アップデートます:
ここでは明らかではない、あなたがあなたのクエリに必要なことは、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
所属していません StackOverflow