2009-06-26 44 views
14

このコードは、ある文字列の位置に基づく文字を基本的に別の文字列の同じ位置にある文字に変換し、テーブル内のすべての行に対して実行します。FOR XML PATH( ''): "特殊"文字をエスケープする

私はこの(簡易版)を実行します。

DECLARE @R   char(40) 
DECLARE @U   char(40) 
SET @R=' [email protected]#$%^&*()_+'+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('')を使用して個々の行の値を連結しました。

+0

Iこれが実際のコードであることを確信していますが、同じ問題を説明する簡単な例を実際に投稿してください。それは問題がかなり簡単になる可能性があるが、消化するコードはかなり奇妙である。 –

+0

@ジョン・サンダース、私はこれが私の "本当のコード"だったと思う。申し訳ありませんが、最終的なコードはより複雑になります。これは、1つのクエリの一部であるためです。 –

答えて

22

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 
+1

は完全に機能します!ありがとう! –

+2

+1 - この回答は私を助けてくれました。私は '、TYPE'をしばらく逃した。 –

+0

TYPEも忘れました。それを指摘してくれてありがとう。 +1 – rageit

関連する問題