0

複数の CROSS-APPLY ステートメントを使用せずに、次の XML を (T-SQL スクリプトで) 解析する方法はありますか? お気づきのように、ルートの子には異なる名前が付いています (それらは完全に異なります。最後の桁のインデックスだけが異なるわけではありません)。

この XML を、すべての MeasuredParamName* が列で、すべての値が行を表すテーブルに分割したいと考えています。各 MeasuredParamName 要素には、同じ数の子が含まれます。

すなわち。(MeasuredParamName1、MeasuredParamName2、MeasuredParamName3、MeasuredParamName4)

このソリューションに相互適用を使用すると、パフォーマンス上の問題はありますか? XML の別の構造の方が適切でしょうか?

元:

<Data>
<MeasuredParamName1>
    <Value>1</Value>
    <Value>2</Value>
</MeasuredParamName1>
<MeasuredParamName2>
    <Value>3</Value>
    <Value>4</Value>
</MeasuredParamName2>
<MeasuredParamName3>
    <Value>0.5</Value>
    <Value>0.10</Value>
</MeasuredParamName3>
<MeasuredParamName4>
    <Value>20</Value>
    <Value>30</Value>
</MeasuredParamName4>   
   </Data>
4

1 に答える 1

1

これを試して。

select  
    MeasuredParamName1,MeasuredParamName2,MeasuredParamName3,MeasuredParamName4
from
(
    select  
        x.n.value('local-name(..)', 'varchar(50)') mpname,
        x.n.value('.','varchar(20)') value,
        row_number() over (partition by x.n.value('local-name(..)', 'varchar(50)') order by x.n) as rn  
    from
        @xml.nodes('/Data//Value') x(n)
) v
pivot
(max(value) for mpname in (MeasuredParamName1,MeasuredParamName2,MeasuredParamName3,MeasuredParamName4)) p

XML を設計する場合、「行」の値を列の中に入れます。例えば

<Data>
   <Value>
       <MeasuredParam1>5</MeasuredParam1>
       <MeasuredParam2>6</MeasuredParam2>
       <MeasuredParam3>7</MeasuredParam3>
       <MeasuredParam4>8</MeasuredParam4>
   </Value>
   <Value>
       <MeasuredParam1>11</MeasuredParam1>
       <MeasuredParam2>12</MeasuredParam2>
       <MeasuredParam3>13</MeasuredParam3>
       <MeasuredParam4>14</MeasuredParam4>
   </Value>
</Data>
于 2012-11-19T16:33:27.253 に答える