2013-10-28 14 views
5

Hãy ví dụ đơn giản này:SQL Server tạo ra một không gian tên XML khi mặc định được quy định

declare @myXml xml 
set @myXML = ' 
<root> 
    <line id="1"/> 
    <line id="2"/> 
    <line id="3"/> 
</root>' 
select t.c.query('.') 
from @myXml.nodes('/root/line') t(c) 

Đúng như dự đoán, tôi nhận lại ba hàng, nhìn như thế này:

<line id="1" /> 

Tuy nhiên, khi XML khai báo vùng tên của nó (thậm chí chỉ là các xmlns mặc định), bạn cũng cần xác định không gian tên đó trong SQL, hoặc tập kết quả của bạn sẽ làm trống rỗng. Tôi biết theo hai cách: một tuyên bố tuyên bố trong cuộc gọi phương thức nút() hoặc với tuyên bố xmlnamespaces. Hãy sử dụng cái sau:

declare @myXml xml 
set @myXML = ' 
<root xmlns="urn:somename"> 
    <line id="1"/> 
    <line id="2"/> 
    <line id="3"/> 
</root>'; 

with xmlnamespaces(default 'urn:somename') 
select t.c.query('.') 
from @myXml.nodes('/root/line') t(c) 

Trong khi bây giờ tôi nhận được kết quả, có một sự kỳ quặc nhất định trong kết quả. Không gian tên được chỉ định được thêm là "p1" thay vì mặc định. Vì vậy, đầu ra của tôi trông như thế này:

<p1:line xmlns:p1="urn:somename" id="1" /> 

Trong this Technet article, phần B. Khai báo một namespace mặc định cho thấy những gì tôi đang cố gắng để đạt được, nhưng tôi nhận được kết quả thể hiện trong D. Xây dựng sử dụng không gian tên mặc định. Vì ví dụ của tôi không giống như ví dụ sau, tôi không hiểu tại sao tôi lại nhận được các tiền tố này.

Cập nhật: Vì lợi ích của sự hoàn chỉnh, điều này mang lại chính xác triệu chứng giống như với xmlnamespaces cú pháp:

select t.c.query('.') 
from @myXml.nodes('declare default element namespace "urn:somename";/root/line') t(c) 
+0

Tôi nghĩ rằng bạn sẽ cần phải khai báo không gian tên mặc định yếu tố trong bản Tuyên Bố XQuery của bạn, như bài báo cho thấy trong B. – wst

+0

@wst tôi nhận được chính xác những triệu chứng như nhau cho dù tôi sử dụng cú pháp xmlnamespaces, hoặc báo cáo kết quả kê khai. –

+0

Bạn đã thử khai báo vùng tên mặc định trong câu lệnh 'select' chưa? – wst

Trả lời

4

Khai báo không gian tên nguyên tố mặc định trong select khi bạn bước đầu truy vấn XML và tất cả các yếu tố sẽ sử dụng khai báo không gian tên mặc định thay vì tiền tố:

declare @myXml xml 
set @myXML = ' 
<root xmlns="urn:somename"> 
    <line id="1"/> 
    <line id="2"/> 
    <line id="3"/> 
</root>';  
with xmlnamespaces(default 'urn:somename') 
select t.c.query(' 
    declare default element namespace "urn:somename"; 
    .') 
from @myXml.nodes('/root/line') t(c) 

=>

<line xmlns="urn:somename" id="1" /> 
<line xmlns="urn:somename" id="2" /> 
<line xmlns="urn:somename" id="3" /> 
Các vấn đề liên quan