2009-06-26 83 views
14

Mã này về cơ bản dịch các ký tự dựa trên vị trí trong một chuỗi thành ký tự ở cùng vị trí trong chuỗi khác và nó chạy cho tất cả các hàng trong bảng.FOR XML PATH (''): Ký tự "đặc biệt"

Khi tôi chạy này (phiên bản đơn giản):

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 

tôi nhận được như sau:

RowID  readable 
----------- --------------------------------------- 
1   a&#x20;simple&#x20;translation 
2   hello&#x20;world 
3   wow&#x20;you&#x20;ran&#x20;this 

Nhưng cần:

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

Có cách nào, trừ REPLACE() , để có không gian hiển thị đúng cách? Điều này cũng xảy ra trên các ngắt dòng, trong mã thực tế của tôi.

Điều này có thể được viết lại theo cách tốt hơn không? Về cơ bản tôi chỉ sử dụng FOR XML PATH('') để ghép các giá trị hàng riêng lẻ lại với nhau.

+0

tôi chắc chắn đây là mã thực sự của bạn, nhưng bạn thực sự nên đăng một ví dụ đơn giản hơn để minh họa cùng một vấn đề. Đó là một số tiền hợp lý của mã kỳ lạ để tiêu hóa, mặc dù vấn đề có thể sẽ đơn giản hơn rất nhiều. –

+0

@ John Saunders, tôi ước rằng đó là "mã thực sự" của tôi, bởi vì tôi sẽ được thực hiện ngay bây giờ! Xin lỗi để nói rằng mã cuối cùng sẽ phức tạp hơn, vì đây là một phần nhỏ của một truy vấn. –

Trả lời

22

XML bạn nhận được là chính xác. Đó là XML, không phải văn bản và có thể đọc được dưới dạng XML bởi trình phân tích cú pháp XML. Các ký tự đặc biệt được thoát đúng cách, như chúng cần. Bất kể mô-đun khách hàng nào mà bạn có mà tiêu thụ XML nên phân tích cú pháp nó dưới dạng XML, không phải là văn bản, và sau đó nó sẽ hiển thị đúng.

Cập nhật:

Trong trường hợp không rõ ràng, tất cả các bạn cần phải làm trong truy vấn của bạn là để điều trị XML như XML và văn bản dưới dạng văn bản, không pha trộn XML dưới dạng văn bản, ví dụ:

;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

hoạt động hoàn hảo! cảm ơn! –

+2

+1 - câu trả lời này đã giúp tôi. Tôi đã bỏ lỡ ', TYPE' trong một thời gian. –

+0

Tôi cũng đã bỏ lỡ TYPE. Cảm ơn đã chỉ ra điều đó. +1 – rageit

Các vấn đề liên quan