15

このコードは基本的に、ある文字列の位置に基づいて文字を別の文字列の同じ位置にある文字に変換し、テーブルのすべての行に対して実行します。

これを実行すると(簡易版):

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('')、個々の行の値を連結するために を使用しました。

4

1 に答える 1

23

取得した 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
于 2009-06-27T08:00:46.740 に答える