2011-07-08 5 views
0

私は以下のXMLを持っています。私はopenxmlを使用してXMLの属性と要素を読んでみたいと思います。SQL Server 2008でOpenxmlを使用してXMLの属性と要素を読み取る

<Report> 
    <Datapoints> 
      <Datapoint>10</Datapoint> 
      <Datapoint>11</Datapoint> 
    </Datapoints> 
<Filters>     
     <Filter Id="5" FilterTypeId="4">    
      <Option2>21</Option2> 
      <Option2>22</Option2>    
      <Option2>23</Option2> 
     </Filter>   
     <Filter Id="6" FilterTypeId="4">    
      <Option2>21</Option2> 
      <Option2>22</Option2>    
      <Option2>23</Option2> 
     </Filter> 
    </Filters>   
</Report> 

私は要素option2と一緒にタグFilterIdFilterTypeId)の属性を読みたいです。

答えて

2

なぜOPENXML ??過度に使いにくく、使いにくいようです - SQL ServerのXPath/XQuery機能を使用してください!基本的には、(Rep(Filter)の別名を持つ).nodes()の最初の使用は、「作成します

FilterID FilterTypeID Option2 
    5   4   21 
    5   4   22 
    5   4   23 
    6   4   21 
    6   4   22 
    6   4   23 

:これはあなたのような出力に何かを与える必要があり

DECLARE @input XML = '<Report> 
    <Datapoints> 
      <Datapoint>10</Datapoint> 
      <Datapoint>11</Datapoint> 
    </Datapoints> 
<Filters>     
     <Filter Id="5" FilterTypeId="4">    
      <Option2>21</Option2> 
      <Option2>22</Option2>    
      <Option2>23</Option2> 
     </Filter>   
     <Filter Id="6" FilterTypeId="4">    
      <Option2>21</Option2> 
      <Option2>22</Option2>    
      <Option2>23</Option2> 
     </Filter> 
    </Filters>   
</Report>' 
SELECT 
    Filter.value('(@Id)[1]', 'int') AS 'FilterID', 
    Filter.value('(@FilterTypeId)[1]', 'int') AS 'FilterTypeID', 
    Opt2.value('(.)[1]', 'varchar(50)') AS 'Option2' 
FROM 
    @input.nodes('/Report/Filters/Filter') AS Rep(Filter) 
CROSS APPLY 
    Filter.nodes('Option2') AS Rep2(Opt2) 

すると、このような何かを試してみてください<Filter> XMLタグ(XMLタグごとに1つの行)とSELECTの最初の2つの項目は、<Filter> XMLタグのそれぞれの属性を取得しています。

次に、最初の疑似テーブルのフィルタXMLタグに基づいて、各フィルタ内にすべての<Option2>要素の2番目の列挙型(2番目の数値は.nodes()の呼び出し)が必要です。これはXMLタグの内容をその値として出力するだけです。

+1

XPath/XQueryはXMLを処理する方が優れています。 –

関連する問題