2017-08-29 8 views
0

かなり大きいXMLブロブを(XMLタイプのカラムに)保存し、必要に応じてその場でXMLのサブセットを構築しようとするskunkworksプロジェクトを追求しています。保存されたXML値から新しいXMLを構築する

のは、私は与えられた列に当社のデータベーステーブルに格納されているこのXMLブロブを持っているとしましょう:

<root> 
    <header> 
     <id>1</id> 
     <name id="foo">Name</name> 
    </header> 
    <body> 
     <items> 
      <addItem> 
       <val>1</val> 
      </addItem> 
      <observeItem> 
       <val>2</val> 
      </observeItem> 
     </items> 
    </body> 
</root> 

私が取得したいこれは基本的には上記文書構造を再作成するだけのものを含めることですitems子供、例えばので:私はちょうどobserveItem記録に興味を持っていた場合(items要素が子どもの数に制限はありませんが、私は唯一のこれまでの単一のものに興味があるでしょう

<root> 
    <header> 
     <id>1</id> 
     <name id="foo">Name</name> 
    </header> 
    <body> 
     <items> 
      <observeItem> 
       <val>2</val> 
      </observeItem> 
     </items> 
    </body> 
</root> 

それら)。

私はSELECT @XML.query('//items/child::*[2]')のような何かを行うことができますが、特定の子アイテムを取得することができますが、どのようにそれらの子の1つだけのクエリで完全な元のドキュメントを構築するでしょうか?

+1

あなたは構造から子を削除するだけですか?よりダイナミックにする必要がありますか? –

+0

@ MasterYodaはよりダイナミックにする必要があり、実際には、それぞれの子どものためにこの構造を構築する可能性があります。この全努力は、何かがキャッシュから脱落するようなエッジケースをサポートすることに過ぎず、報告目的でこの「アイテム」固有の構造をオンザフライで構築する必要があります。 –

答えて

0

私は解決策を作ってみたが、私はそれに完全に満足していないよ:

DECLARE @XML XML = ' 
    <root> 
     <header> 
      <id>1</id> 
      <name id="foo">Name</name> 
     </header> 
     <body> 
      <items> 
       <addItem> 
        <val>1</val> 
       </addItem> 
       <observeItem> 
        <val>2</val> 
       </observeItem> 
      </items> 
     </body> 
    </root>' 


DECLARE @NthChild INT = 2 

SELECT 
    @XML.query('//header'), 
    @XML.query('//items/child::*[sql:variable("@NthChild")]') AS 'items' 
FOR XML PATH('root') 

私は明示的にrootitemsを指定する必要が好きではありませんが、私はこのアプローチを考えます私を得ることができます。

関連する問題