2012-02-16 27 views
11

Tôi có một bảng gọi là Map_Data và các dữ liệu trông giống như:Nhân vật phụ trong khi sử dụng XML PATH

ID SoCol                Descol 
125 case Per_rating when 5 then 'Good' when 4 then 'Ok' else null end D_Code 

Và tôi đã viết một truy vấn trên hàng cụ thể này và truy vấn là:

SELECT Params = (SELECT DesCol + ' = ''' + SoCol + '''' 
        FROM  dbo.Map_Data t1 
        WHERE ID = 125 
        FOR 
        XML PATH('') 
       ) 

và Tôi nhận được kết quả như sau:

D_Code = 'case per_rating
 when 5 then 'Good'
 when 4
 then 'Ok'
 end' 

Bất cứ ai có thể cho tôi biết lý do tôi nhận được '
' và làm cách nào tôi có thể sửa?

+1

Kiểm tra nội dung của Mapdata, tôi nghĩ rằng có # 13 (Vận chuyển hàng hóa) trong đó. Chúng có thể không hiển thị trong bất kỳ thứ gì bạn đang sử dụng để hiển thị nội dung bảng. Cho dù họ có vẻ như SoCol đã được làm đẹp. –

Trả lời

15

thay đổi nhỏ này sẽ làm cho các đối tượng xấu xí đi xa, nhưng họ sẽ không loại bỏ kí tự xuống dòng (nhìn vào các kết quả trong kết quả to Text, không kết quả to Grid, để xem chúng):

SELECT Params = (SELECT DesCol + ' = ''' + SoCol + '''' 
        FROM  dbo.Map_Data t1 
        WHERE ID = 125 
        FOR 
        XML PATH(''), TYPE 
       ).value('.[1]', 'nvarchar(max)'); 

Nếu bạn muốn thoát khỏi CR/LF quá bạn có thể nói:

SELECT Params = (SELECT REPLACE(REPLACE(DesCol + ' = ''' + SoCol + '''', 
    CHAR(13), ''), CHAR(10), '') 
        FROM  dbo.Map_Data t1 
        WHERE ID = 125 
        FOR 
        XML PATH(''), TYPE 
       ).value('.[1]', 'nvarchar(max)'); 

Ngoài ra tôi không chắc chắn làm thế nào bạn sẽ sử dụng đầu ra nhưng nếu bạn đang đi để đánh giá nó sau này với động SQL bạn sẽ cần phải thay thế các dấu nháy đơn được nhúng (') bằng hai dấu nháy đơn (''). Nếu không nó sẽ nổ tung bởi vì chúng cũng là các dấu phân cách chuỗi.

+0

Cảm ơn bạn rất nhiều !!! – peter

+0

Xin lưu ý rằng việc sử dụng '.value' chậm hơn nhiều so với việc sử dụng không có. Tôi đã có một UDF đầy đủ các cuộc gọi như vậy và nó gây ra khá một chút hit hiệu suất. – Sebazzz

+0

@Sebazz Tuyệt vời. Bạn có thể chỉ ra cách lấy cùng một đầu ra mà không sử dụng '.value'? –

0

Bạn cũng có thể đạt được điều này bằng cách chỉ giữ tất cả mã trong một trích dẫn trong một dòng. Tôi cũng đã có vấn đề tương tự và nó được giải quyết bằng cách giữ tất cả các mã trong một dòng.

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