質問

このコードは、基本的には、別の文字列内の同じ位置にある文字を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&#x20;simple&#x20;translation
2           hello&#x20;world
3           wow&#x20;you&#x20;ran&#x20;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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top