2009-06-26 15 views
14

Bu kod temel olarak karakterleri bir dizedeki konuma göre başka bir dizede aynı konuma çevirir ve tablodaki tüm satırlar için çalışır. Bu (basitleştirilmiş versiyonu) çalıştırdığınızdaXML PATH (I ') İÇİN: "özel" karakterlerden kaçınma

: REPLACE() dışındaki

RowID  readable 
----------- --------------------------------------- 
1   a simple translation 
2   hello world 
3   wow you ran this 

herhangi bir yolu var mı,:

RowID  readable 
----------- --------------------------------------- 
1   a simple translation 
2   hello world 
3   wow you ran this 

Ama gerek:

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 

aşağıdaki alıyorum Boşluklar düzgün bir şekilde gösterilmek mi? Bu, gerçek kodumda satır sonlarında da gerçekleşir.

Bu daha iyi bir şekilde yeniden yazılabilir mi? Temel olarak tek tek satır değerlerini birleştirmek için FOR XML PATH('')'u kullandım.

+0

I: durumunda

belli değil, Sorgunuzu yapmanız gereken metin olarak XML ve metin olarak XML tedavi etmektir, metin olarak XML, yani karışmaz Bunun gerçek kodunuz olduğuna emin olun, ancak aynı sorunu gösteren daha basit bir örnek göndermelisiniz. Sorunun daha kolay olması muhtemel olsa da, sindirmek için oldukça tuhaf bir kod. –

+0

@John Saunders, Keşke benim "gerçek kodum" olsaydı, çünkü şimdi işim bitti! Son kodun daha karmaşık olacağını söylemek için üzgünüm, çünkü bu bir sorgunun küçük bir parçası. –

cevap

22

Aldığınız XML doğrudur. Bu, bir XML ayrıştırıcısı tarafından XML olarak okunabilir ve XML olarak okunabilir. XML. Olması gerektiği gibi özel karakterler doğru şekilde kaçtı. Hangi XML modülünü kullanırsanız kullanın, bu XML onu metin olarak değil XML olarak ayrıştırmalı ve sonra düzgün görüntülenecektir.

Güncelleme:

;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

kusursuz çalışıyor! Teşekkürler! –

+2

+1 - Bu cevap bana sadece yardımcı oldu. Yine de bir süredir 'TYPE'yi özledim. –

+0

TYPE'yi de özledim. İşaret ettiğin için teşekkürler. +1 – rageit

İlgili konular