2013-10-28 8 views
5

は、この単純な例を見てみましょう指定されたXML名前空間を作成します(デフォルトのxmlnsだけでも)その名前空間を宣言する場合は、SQLでその名前空間を指定するか、結果セットが空になる必要があります。私は2つの方法を知っています:ステートメントをnodes()メソッド呼び出し内に宣言するか、をxmlnamespacesステートメントで宣言します。のは、後者を使用してみましょう:私は今、結果を得るSQL Serverは、デフォルトでは

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) 

ますが、結果には明確なすごみがあります。指定された名前空間は、デフォルトではなく「p1」として追加されます。だから私の出力は次のようになります。

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

、デフォルトの名前空間の宣言セクションB.は、私が達成しようとしているものを示しているが、私は結果がデフォルトの名前空間を使用してD.建設に示します。私の例はあまり後者に似ていないので、なぜ私はこれらの接頭辞を得ているのか分かりません。

更新: 完全性のために、これはXMLNAMESPACES構文でとまったく同じ症状を与える:

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

は、私はあなたが私がXMLNAMESPACES構文、または宣言文を使用するかどうか、私はまったく同じ症状を取得@wst記事はB. – wst

+0

に示唆するように、あなたのXQueryステートメントでは、デフォルトの要素の名前空間を宣言する必要があると思います。 –

+0

'select'文でデフォルト名前空間を宣言しようとしましたか? – wst

答えて

4

あなたが最初にXMLを照会するときselectにデフォルトの要素の名前空間を宣言しますすべての要素は接頭辞の代わりにデフォルトの名前空間宣言を使用します:

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" />