粉碎XML结构,其中根目录下的每个子节点都是具有不同名称的集合

时间:2012-11-19 16:02:20

标签: xml sql-server-2008 tsql

有没有办法在不使用多个CROSS-APPLY语句的情况下解析(在T-SQL脚本中)以下XML?你可以注意到Root的孩子们有不同的名字(他们完全不同 - 不只是在最后一位数字索引上有所不同)。

我想将这个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>

1 个答案:

答案 0 :(得分: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>