2011-12-01 39 views
24

Về cơ bản tôi có một cột có tên là XML thuộc loại TEXT; điều này không thể thay đổi vì lý do khác, nhưng tôi đã tự hỏi làm thế nào tôi có thể truyền nó sang XML.Không thể truyền TEXT sang XML trong SQL Server

Nó mang lại cho tôi một lỗi

XML phân tích cú pháp: dòng 1, nhân vật 39 tuổi, không có khả năng chuyển đổi các mã hóa

khi cố gắng để làm điều này. Có anyways xung quanh nó để vẫn nhận được nó định dạng để XML? Tôi thực sự bị mắc kẹt vào thời điểm này.

dữ liệu trong cột:

<?xml version="1.0" encoding="utf-16"?> 
<Record> 
    <UserGuid>c624a356-9f18-403c-b404-790e79034c7d</UserGuid> 
</Record> 

Đây là đoạn mã SQL dàn diễn viên:

SELECT CAST(XML AS XML).value('(/Record/UserGuid)[1]', 'NVARCHAR(max)') 
FROM tbl_Module_RequestForms_Items 

Trả lời

45

Vấn đề của bạn là: bạn có XML với một encoding="utf-16", nhưng cột của bạn là một Unicode phi cột ......

Giả sử rằng bạn không thể thay đổi nó để NTEXT hoặc , bạn phải làm hai lồng nhau CAST để đạt được những gì bạn đang tìm kiếm:

SELECT 
    CAST(CAST(XML AS NTEXT) AS XML).value('(/Record/UserGuid)[1]', 'NVARCHAR(max)') 
FROM 
    tbl_Module_RequestForms_Items 

Trước tiên, bạn cần phải cast để NTEXT (hoặc NVARCHAR(MAX)), và sau đó bạn phải truyền kết quả đó đến XML, trước khi bạn có thể sử dụng nó.

Mẹo: loại bỏ những "lý do khác" và chuyển đổi này để XML datatype nếu bạn thực sự cần phải sử dụng nó như là XML .....

+0

Lỗi ´illegal xml character 'nếu tôi thử phương pháp này. SQL Server 2008 R2. Bất kỳ ý tưởng? – Azimuth

+0

@Azimuth: âm thanh như một câu hỏi mới - và chắc chắn đăng XML mẫu! –

+0

@marc_s Tôi nghĩ rằng vấn đề là với các ký tự có dấu trong chuỗi XML của tôi ... – Azimuth

-1

Bạn đã thử CONVERT thay vì CAST?

SELECT CONVERT(XML, @xml).value('(/Record/UserGuid)[1]', 'NVARCHAR(max)') 
from tbl_Module_RequestForms_Items 

Ngoài ra, hãy xem phần "kiểu xml" của trang này; nó chứa một số tùy chọn bạn có khi chuyển đổi xml:

http://msdn.microsoft.com/en-us/library/ms187928.aspx

+0

Không hoạt động hoặc .... không có trong bốn kiểu có sẵn hoạt động, bởi vì đầu vào về cơ bản là Unicode, nhưng kiểu dữ liệu được lưu trữ không phải là Unicode –

+0

Vâng, bạn đã đóng đinh nó; một upvote cho bạn ... – JohnD

25

Bạn nên thay thế encoding="utf-16"-encoding="utf-8" hoặc ''(blank) và sau đó thực hiện thao tác của bạn.

a. Đang chuyển đổi encoding="utf-16" thành encoding="utf-8"

SELECT 
    CAST(
    REPLACE(CAST([xml] AS VARCHAR(MAX)), 'encoding="utf-16"', 'encoding="utf-8"') 
    AS XML).value('(/Record//UserGuid/node())[1]', 'NVARCHAR(max)') as UserGuid 
from tbl_Module_RequestForms_Items 

b. Thay encoding="utf-16" để ''(blank)

SELECT 
    CAST(
    REPLACE(CAST([xml] AS VARCHAR(MAX)), 'encoding="utf-16"', '') 
    AS XML).value('(/Record//UserGuid/node())[1]', 'NVARCHAR(max)') as UserGuid 
from tbl_Module_RequestForms_Items 
+0

Tôi muốn tôi có thể đánh dấu cả hai bên phải, bạn và Marc_s cả hai đã có phương pháp làm việc tuyệt vời. Tôi upvoted của bạn mặc dù. Cảm ơn một lần nữa! –

+0

Xin chào @thesandman, cảm ơn bạn đã ủng hộ, tôi cũng đã bình chọn cho bạn. Tôi đã cố gắng hết sức để trả lời bạn đúng theo nhiều cách. Cảm ơn vì đã dành thời gian cho tôi. –

+4

Truyền qua lại không hiệu quả đối với tôi, nhưng việc xóa 'encoding =" UTF-8 "' rõ ràng như được đề xuất ở đây đã thực hiện thủ thuật. – dakab

2

Đúc biến XML như NTEXT giải quyết vấn đề CAST(CAST (XML AS NTEXT) AS XML).

+0

Đây là câu trả lời được đánh giá thấp. – DarkKnight

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