2013-08-05 34 views
6

Tôi có truy vấn này,Strange Lỗi Phân tích XML: dòng 1, nhân vật 2038, bất hợp pháp xml nhân vật

DECLARE @Result XML; 
SELECT @Result = ( SELECT PD.* 
       FROM [ProductDetailedDescriptions] PD 
         LEFT JOIN [Products] P ON (PD.ProductID= P.ID) 
       WHERE PD.ProductID = 23 
         AND P.RetailerID = 1 
         AND PD.LanguageID = 1 
       ORDER BY [ORDER] 
       FOR XML AUTO, ELEMENTS, ROOT('root') 
      ) 

này ném XML parsing: line 1, character 2038, illegal xml character. Khi tôi chọn chỉ,

SELECT PD.* 
FROM [ProductDetailedDescriptions] PD 
     LEFT JOIN [Products] P ON (PD.ProductID= P.ID) 
WHERE PD.ProductID = 23 
     AND P.RetailerID = 1 
     AND PD.LanguageID = 1 
ORDER BY [ORDER] 
FOR XML AUTO, ELEMENTS, ROOT('root') 

Nó cho thấy xml sau,

<root> 
    .............................................. 
    .............................................. 
    <PD> 
    <ID>4187</ID> 
    <ProductID>23</ProductID> 
    <Header>aa</Header> 
    <Description>with &#x3;other</Description> 
    <Order>7</Order> 
    <LanguageID>1</LanguageID> 
    </PD> 

Lưu ý # x3. Trong ứng dụng của tôi nó chỉ là một không gian. Có một lỗi n SQL Server?

+0

Nội dung của cột Mô tả tương ứng là gì nếu bạn truy vấn trực tiếp mà không có chuyển đổi CML và collation và datatype của cột này là gì? – TToni

+0

@TToni, Nvarchar (MAX). Collation là mặc định. Tôi là một char vô hình. Xem hình trên. – user960567

Trả lời

8

&#x03; là ký tự không hợp lệ trong XML.

Từ Extensible Markup Language (XML) 1.0 (Fifth Edition)

Char :: = # x9 | #xA | #xD | [# x20- # xD7FF] | [# xE000- # xFFFD] | [# x10000- # x10FFFF]

truy vấn của bạn rằng công trình có thể được đơn giản hóa như sau:

select cast(0x3 as char(1)) col 
for xml raw 

Kết quả của các truy vấn trên là một bảng với một hàng và một cột với các kiểu dữ liệu nvarchar(max) .

Khi gán cho biến XML bạn gặp lỗi.

declare @XML xml = 
(
    select cast(0x3 as char(1)) col 
    for xml raw 
) 

Msg 9420, Level 16, State 1, Line phân tích cú pháp 1 XML: dòng 1, nhân vật 16, bất hợp pháp xml nhân vật

Hoặc khi bạn chỉ định các chỉ thị type cột sẽ một cột XML và bạn nhận được một lỗi chi tiết hơn.

select cast(0x3 as char(1)) col 
for xml raw, type 

Msg 6841, Level 16, State 1, Line 1 FOR XML không thể sắp đặt từng dữ liệu cho nút 'col' bởi vì nó có chứa một ký tự (0x0003) là không được phép vào XML. Để truy xuất dữ liệu này bằng cách sử dụng FOR XML, hãy chuyển đổi nó thành loại dữ liệu nhị phân, varbinary hoặc hình ảnh và sử dụng chỉ thị BINARY BASE64 .

Bạn phải xóa các ký tự không hợp lệ trước khi tạo XML.

declare @XML xml = 
replace((
     select cast(0x3 as char(1)) col 
     for xml raw 
     ), '&#x03;', '') 
+0

Nhưng tại sao máy chủ sql ném lỗi trong khi ấn định. nó có ý nghĩa không? – user960567

+1

@ user960567 Lỗi có ý nghĩa. Rằng bạn không nhận được một lỗi khi không gán hoặc sử dụng 'loại' là hơi khó hiểu. Nhưng nó đang trở lại một nvarchar vì vậy nó hoạt động nhưng nó là lạ đối với tôi. –

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