2017-07-01 11 views
2

ここでは私のSQLです:TSQL-失敗したXMLを解析するために(名前空間)

create table sqm (data xml)  
    insert into sqm 
    select '<DataSet xmlns="http://www.bnr.ro/xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.bnr.ro/xsd nbrfxrates.xsd"> 
      <Cube date="2017-06-30"> 
       <Rate currency="AED">1.0867</Rate> 
       <Rate currency="AUD">3.0665</Rate> 
       <Rate currency="BGN">2.3284</Rate> 
      </Cube> 
      </DataSet>' 

    select 
    m.c.value('@date', 'date') as valuta 
    from sqm as s 
    outer apply s.data.nodes('/DataSet/Body/Cube') as m(c) 

私のSQLをDBにNULLを返す保持理由を見つけようとして時間を過ごした後、私は私の問題は、によるものであったことを発見しましたハイパーリンクは、XMLの最初の部分(DataSetの後)で参照されます。 私は本当になぜこれが起きているのか知りたいのですが、<DataSet end >の間ですべてを削除することができます。他の選択肢はありますか?

あなたがより良いタイトルを考えることができる場合は、編集してください。

答えて

2

あなたは、私がいることを取り除くようWITH XMLNAMESPACES

はまた、あなたの例のXMLは一切Body要素を持っていない使用して名前空間を宣言する必要があるのXpathから。

Demo

WITH XMLNAMESPACES (DEFAULT 'http://www.bnr.ro/xsd') 

select 
m.c.value('@date', 'date') as valuta 
from sqm as s 
outer apply s.data.nodes('/DataSet/Cube') as m(c) 

または代わりにあなたがマーティンのソリューション(1)のほかに

select 
m.c.value('@date', 'date') as valuta 
from sqm as s 
outer apply s.data.nodes('/*:DataSet/*:Cube') as m(c) 
+0

私は見ていますが、ネームパック私は[ここ](https://stackoverflow.com/questions/18054652/how-can-i-to-read-a-xml-from-a-url-using-tのようなURLからXMLを解析するときに置く-sql)事前に感謝します。 –

+1

@ s.dragos Xpathを使用する同じステートメントの一部である必要があります –

2

を使用することができますが、これXML名前空間のインライン宣言を使用しているもう一つの解決策があります:

-- Solution #1 
select m.c.value('@date', 'date') as valuta 
from sqm as s 
outer apply s.data.nodes('declare default element namespace "http://www.bnr.ro/xsd";DataSet/Cube') as m(c) 

-- Solution #2 
select m.c.value('@date', 'date') as valuta 
from sqm as s 
outer apply s.data.nodes(' 
    declare default element namespace "http://www.bnr.ro/xsd"; 
    declare namespace xsi="http://www.w3.org/2001/XMLSchema-instance"; 
    declare namespace schemaLocation="http://www.bnr.ro/xsd nbrfxrates.xsd"; 
    DataSet/Cube') as m(c) 
関連する問題