2017-09-14 1 views
1

U-SQLでは、要素内の要素のリストを取得しようとしています(XmlExtractorを使用)。しかし、私はネストされたコレクションを取得することはできません。XmlExtractorを使用したU-SQL - 要素内の要素

ロケーションのあるアイテムのリストです。 XmlExtractorでは、要素のコレクションを取得できますが、コレクションを含むコレクションを取得する方法はわかりません。 XMLサンプルを以下に示します。

アイデア?文字列は結果の区切りカンマたSQL.Arrayを返す、1つの文字列内のXMLを受け取り、その後、XPathを使用してメソッドを呼び出す抽出を行うことで解決

<root> 
<Item> 
    <Header> 
     <id>111</id> 
    </Header> 
    <Body> 
     <Locations> 
      <Location> 
       <Station>k4</Station> 
       <Timestamp>2017-08-30T02:04:18.2506945+02:00</Timestamp> 
      </Location> 
      <Location> 
       <Station>k5</Station> 
       <Timestamp>2017-08-30T02:04:18.2506945+02:00</Timestamp> 
      </Location> 
     </Locations> 
    </Body> 
</Item> 
<Item> 
    <Header> 
     <id>222</id> 
    </Header> 
    <Body> 
     <Locations> 
      <Location> 
       <Station>k4</Station> 
       <Timestamp>2017-08-30T02:12:36.1218601+02:00</Timestamp> 
      </Location> 
      <Location> 
       <Station>k5</Station> 
       <Timestamp>2017-08-30T02:12:36.1218601+02:00</Timestamp> 
      </Location> 
     </Locations> 
    </Body> 
</Item> 
</root> 
+0

は、あなたの期待される結果がどのように見えるかを確認することができますか? – wBob

答えて

1

。結果は以下のようになります。標準XmlExtractorはこれを行うことはできません

111;k4,2017-08-30T02:04:18.2506945+02:00 
111;k5,2017-08-30T02:04:18.2506945+02:00 
222;k4,2017-08-30T02:12:36.1218601+02:00 
222;k5,2017-08-30T02:12:36.1218601+02:00 

、と私はまた、上に複数のステップが存在する可能性があるため、それが抽出された後に、XMLの構文解析を延期する方が良いと判断しました同じxml。

1

Azure SQLデータベースには、XMLを細断処理す​​る強力な機能があります。おそらくこれがあなたの不動産/建築にあるのであれば、それはカスタムコードの簡単な代替手段になるでしょうか?簡単な例:

DECLARE @xml XML = '<root> 
<Item> 
    <Header> 
     <id>111</id> 
    </Header> 
    <Body> 
     <Locations> 
      <Location> 
       <Station>k4</Station> 
       <Timestamp>2017-08-30T02:04:18.2506945+02:00</Timestamp> 
      </Location> 
      <Location> 
       <Station>k5</Station> 
       <Timestamp>2017-08-30T02:04:18.2506945+02:00</Timestamp> 
      </Location> 
     </Locations> 
    </Body> 
</Item> 
<Item> 
    <Header> 
     <id>222</id> 
    </Header> 
    <Body> 
     <Locations> 
      <Location> 
       <Station>k4</Station> 
       <Timestamp>2017-08-30T02:12:36.1218601+02:00</Timestamp> 
      </Location> 
      <Location> 
       <Station>k5</Station> 
       <Timestamp>2017-08-30T02:12:36.1218601+02:00</Timestamp> 
      </Location> 
     </Locations> 
    </Body> 
</Item> 
</root>' 


/* 
111;k4,2017-08-30T02:04:18.2506945+02:00 
111;k5,2017-08-30T02:04:18.2506945+02:00 
222;k4,2017-08-30T02:12:36.1218601+02:00 
222;k5,2017-08-30T02:12:36.1218601+02:00 
*/ 

SELECT 
    r.c.value('(Header/id/text())[1]', 'int') id, 
    b.c.value('(Station/text())[1]', 'varchar(10)') station, 
    b.c.value('(Timestamp/text())[1]', 'varchar(40)') [timestamp], 
    b.c.value('(Timestamp/text())[1]', 'datetimeoffset') [timestamp2] 
FROM @xml.nodes('root/Item') r(c) 
    CROSS APPLY r.c.nodes('Body/Locations/Location') b(c) 

XMLがテーブルにも格納されている場合は、同様のことができます。

マイ結果: My results

関連する問題