2011-01-25 35 views
5

Tôi có một bảng có cột XMLTYPE có tên 'InvoiceXML'.Cách xóa tên cột khi chọn từ cột XMLTYPE bằng cách sử dụng FOR XML PATH

Dữ liệu trong cột này là XML trong các hình thức:

<Invoice CustomerNum="1234" > 
<CustomDeliveryDetails /> 
</Invoice> 

Khi tôi làm một

SELECT ... FOR XML PATH(''), ROOT('Invoices') 

tôi kết thúc với:

<Invoices> 
<InvoiceXML> 
    <Invoice CustomerNum="1234" > 
    <CustomDeliveryDetails /> 
    </Invoice> 
</InvoiceXML> 
</Invoices> 

Làm thế nào để ngăn chặn sự tên cột InvoiceXML xuất hiện trong đầu ra?

Trả lời

1

Hãy thử:

SELECT cast(cast(InvoiceXML as nvarchar(max)) + '' as XML) 
FROM whatever 
FOR XML PATH(''), ROOT('Invoices') 
+0

Đừng nghĩ rằng bạn được phép nối một chuỗi trực tiếp lên cột XML. Bạn cần phải nhân đôi: 'cast (cast (InvoiceXML như nvarchar (max)) + '' as XML)' –

+0

+1 Sau khi xem xét thêm, tôi nghĩ rằng nó có thể được đơn giản hóa hơn nữa. Tôi có vẻ như 'cast (InvoiceXML as XML)' là đủ. –

+0

Tôi sẽ downvote nếu tôi có đủ đại diện bởi vì các diễn viên để nvarchar (tối đa) về cơ bản phá vỡ các loại XML do hạn chế chiều dài. varchar (max), nvarchar (max) và xml có thể lưu trữ 2GB nhưng nvarchar sử dụng 2x storge cho mỗi ký tự. Tham khảo: http://technet.microsoft.com/en-us/library/ms186939.aspx và http://msdn.microsoft.com/en-us/library/ms187339.aspx – rainabba

0

Hãy thử điều này:

SELECT InvoiceXML.query('//Invoice') 
    FROM <YOUR_TABLE> 
FOR XML PATH('') 
Cố gắng xác định một truy vấn XPath để hóa đơn trong XML PATH FPR ví dụ: `CHO PATH XML ('// InvoiceXML') `
+0

Điều đó có hiệu quả không? Khi tôi thử, nó cung cấp cho tôi: 'Tên hàng '// InvoiceXML' chứa một định danh XML không hợp lệ theo yêu cầu của FOR XML; '/' (0x002F) là ký tự đầu tiên có lỗi.' Loại bỏ các dấu gạch chéo kép trong '' gói mỗi hàng hai lần. – Tadmas

+0

Không kiểm tra phiên bản cũ của câu trả lời, khi xác minh nó không thành công :). Đã cập nhật bài đăng với phiên bản đang hoạt động. Thx – Chandu

4
declare @T table (invoiceXML xml) 

insert into @T values (
    '<Invoice CustomerNum="1234" > 
    <CustomDeliveryDetails /> 
    </Invoice> 
    ') 

insert into @T values (
    '<Invoice CustomerNum="4321" > 
    <CustomDeliveryDetails /> 
    </Invoice> 
    ') 

select (select T.invoiceXML) 
from @T as T 
for xml path(''), root('Invoices') 

Chỉnh sửa 1 Truy vấn con (select T.invoiceXML) không có tên cột để nó bị loại bỏ.

+0

Rất đẹp. Bạn có lẽ nên thêm lý do tại sao giải pháp của bạn hoạt động: truy vấn phụ không được đặt tên, do đó, nó không có tên cột để đưa vào phần tử chứa, khiến cho nó bị xóa. – Tadmas

+0

Cảm ơn, tôi sẽ làm điều đó. –

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