2016-09-12 9 views
1

MSSQLデータベースのXMLフィールド/テーブルに多数の大きなXMLファイルをロードしました。私のテーブル(XMLImport)には2つのカラムがあります。 ID列とXMLファイルのXMLColumnというラベルの付いた第2列。私は今、データベースのさまざまな場所にロードできるように、そのデータから特定の要素を取得する必要があります。私は以下のXMLファイルの基本フォーマットを含んでいます。要素、サブ要素、およびサブブロックの数は、ファイルごとに異なります。XQueryで未知数の子要素と孫要素

<root> 
    <data1>apples</data1> 
    <data2>pears</data2> 
    <data3>coconuts</data3> 
    <element1> 
    <data1>white</data1> 
    <data2>brown</data2> 
    <data3>green</data3> 
    <data4>yellow</data4> 
    <data5>blue</data5> 
    <subelement1> 
     <data1>one</data1> 
     <data2>two</data2> 
     <data3>three</data3> 
     <data4>four</data4>   
     <subsubelement1> 
      <data1>name1</data1> 
      <data2>slow</data2> 
     </subsubelement1> 
     <subsubelement2> 
      <data1>name2</data1> 
      <data2>fast</data2> 
     </subsubelement2> 
    </subelement1> 
    <subelement2> 
     <data1>five</data1> 
     <data2>six</data2> 
     <data3>seven</data3> 
     <data4>eight</data4>  
     <subsubelement1> 
      <data1>name3</data1> 
      <data2>fast</data2> 
     </subsubelement1> 
    </subelement2> 
    </element1> 
    <element2> 
    <data1>red</data1> 
    <data2>pink</data2> 
    <data3>purple</data3> 
    <data4>black</data4> 
    <subelement1> 
     <data1>nine</data1> 
     <data2>ten</data2> 
     <data3>eleven</data3> 
     <data4>twelve</data4>   
    </subelement1> 
    <subelement2> 
     <data1>thirteen</data1> 
     <data2>fourteen</data2> 
     <data3>fifteen</data3> 
     <data4>sixteen</data4> 
     <subsubelement1> 
      <data1>name1</data1> 
      <data2>fast</data2> 
     </subsubelement1> 
    </subelement2> 
    </element2> 
    <element3> 
    <data1>text</data1> 
    <data2>text</data2> 
    <data3>text</data3> 
    <data4>text</data4> 
    <data5>text</data5> 
    <subelement1> 
     <data1>text</data1> 
     <data2>text</data2> 
     <data3>text</data3> 
     <data4>text</data4>   
     <subsubelement1> 
      <data1>text</data1> 
      <data2>text</data2> 
     </subsubelement1> 
    </subelement1> 
    </element3> 
</root> 

私はこのような出力を生成できるようにする必要があります。

apples | pears | white | brown | two | name1 | slow 
apples | pears | white | brown | two | name2 | fast 
apples | pears | white | brown | six | name3 | fast 
apples | pears | red | pink | ten | name1 | fast 
etc. 

私は関係なく、1つのサブ要素の下にありますどのように多くのsubsubelementsのsubsubelementレベルからデータを取得する必要があります。そして、私は次のサブ要素に移り、同じことをする必要があります。その後、データ内の次の要素に移動して繰り返します。ここに私の現在の質問があります。

USE MyDatabase 
GO 
SELECT XMLColumn.value('(/root/data1)[1]','varchar(150)') AS FirstColumn, 
     XMLColumn.value('(/root/data2)[1]','varchar(150)') AS SecondColumn, 
     XMLColumn.value('(/root/element1/data1)[1]','varchar(150)') AS ThirdColumn, 
     XMLColumn.value('(/root/element1/data2)[1]','varchar(150)') AS FourthColumn, 
     XMLColumn.value('(/root/element1/subelement1/data2)[1]','varchar(150)') AS FifthColumn, 
     XMLColumn.value('(/root/element1/subelement1/subsubelement1/data1)[1]','varchar(150)') AS SixthColumn, 
     XMLColumn.value('(/root/element1/subelement1/subsubelement1/data2)[1]','varchar(150)') AS SeventhColumn 
FROM dbo.XMLImport 

[1]を別の番号に変更すると、そのレベルで次の値を取得できますが、複数の値を取得することはできません。このデータをループする方法はありますか?いかなる援助も感謝します。ありがとうございました。

+2

実際のXMLでは:要素には実際に番号が付けられていますか(data1、data2、...)? – Shnugo

+0

@ Shnugo - いいえ、私のデータは分類されています。私は層数とばらつきを示す何かを作ろうとしていました。 XMLに関する経験はありません。私はSQLプログラマです。 –

答えて

0

あなたはこのような何かを試すかもしれませんが - 正直に言うと - 私はあなたが入れたいか分からないこのサイドバイサイド ...

DECLARE @xml XML= 
'<root> 
    <data1>apples</data1> 
    <data2>pears</data2> 
    <data3>coconuts</data3> 
    <element1> 
    <data1>white</data1> 
    <data2>brown</data2> 
    <data3>green</data3> 
    <data4>yellow</data4> 
    <data5>blue</data5> 
    <subelement1> 
     <data1>one</data1> 
     <data2>two</data2> 
     <data3>three</data3> 
     <data4>four</data4>   
     <subsubelement1> 
      <data1>name1</data1> 
      <data2>slow</data2> 
     </subsubelement1> 
     <subsubelement2> 
      <data1>name2</data1> 
      <data2>fast</data2> 
     </subsubelement2> 
    </subelement1> 
    <subelement2> 
     <data1>five</data1> 
     <data2>six</data2> 
     <data3>seven</data3> 
     <data4>eight</data4>  
     <subsubelement1> 
      <data1>name3</data1> 
      <data2>fast</data2> 
     </subsubelement1> 
    </subelement2> 
    </element1> 
    <element2> 
    <data1>red</data1> 
    <data2>pink</data2> 
    <data3>purple</data3> 
    <data4>black</data4> 
    <subelement1> 
     <data1>nine</data1> 
     <data2>ten</data2> 
     <data3>eleven</data3> 
     <data4>twelve</data4>   
    </subelement1> 
    <subelement2> 
     <data1>thirteen</data1> 
     <data2>fourteen</data2> 
     <data3>fifteen</data3> 
     <data4>sixteen</data4> 
     <subsubelement1> 
      <data1>name1</data1> 
      <data2>fast</data2> 
     </subsubelement1> 
    </subelement2> 
    </element2> 
    <element3> 
    <data1>text</data1> 
    <data2>text</data2> 
    <data3>text</data3> 
    <data4>text</data4> 
    <data5>text</data5> 
    <subelement1> 
     <data1>text</data1> 
     <data2>text</data2> 
     <data3>text</data3> 
     <data4>text</data4>   
     <subsubelement1> 
      <data1>text</data1> 
      <data2>text</data2> 
     </subsubelement1> 
    </subelement1> 
    </element3> 
</root>'; 

--Theクエリ

SELECT lvl1.value('(./text())[1]','nvarchar(max)') AS NodeValue1 
     ,lvl2.value('(./text())[1]','nvarchar(max)') AS NodeValue2 
     ,lvl3.value('(./text())[1]','nvarchar(max)') AS NodeValue3 
     ,lvl4.value('(./text())[1]','nvarchar(max)') AS NodeValue4 
FROM @xml.nodes('/root/*') AS A(lvl1) 
OUTER APPLY lvl1.nodes('*') AS B(lvl2) 
OUTER APPLY lvl2.nodes('*') AS C(lvl3) 
OUTER APPLY lvl3.nodes('*') AS D(lvl4) 
+0

ありがとう、私はこれを試してみましょう。私は、行の中に表示されたものをテーブルの行にロードする必要があることを実際には必要としません。私は、複数のサブブローブがある場合、ある行のいくつかのフィールドが別の行に対して同じである必要があることを示すことを試みていました。 –

関連する問題