0

我有以下 XML 结构

<?xml version="1.0" encoding="utf-8"?>
<DataItems>
    <DataItem>
        <ID>ID1</ID>
        <Metric1>Metric11Value</Metric1>
        <Metric2>Metric12Value</Metric2>
        <OptionalParameters>
           <OptionalParameter>
              <ParameterName>ParamName1</ParameterName>
              <ParameterValue>ParamValue1</ParameterValue>
              <ParameterUnits>ParamUnits1</ParameterUnits>
           <OptionalParamter> 
           <OptionalParameter>
              <ParameterName>ParamName2</ParameterName>
              <ParameterValue>ParamValue2</ParameterValue>
              <ParameterUnits>ParamUnits2</ParameterUnits>
           <OptionalParamter>
           <OptionalParameter>
              <ParameterName>ParamName3</ParameterName>
              <ParameterValue>ParamValue3</ParameterValue>
              <ParameterUnits>ParamUnits3</ParameterUnits>
           <OptionalParamter>
        </OptionalParamters>
    <DataItem>
        <ID>ID2</ID>
        <Metric1>Metric21Value</Metric1>
        <Metric2>Metric22Value</Metric2>
        <OptionalParameters>
           <OptionalParameter>
              <ParameterName>ParamName1</ParameterName>
              <ParameterValue>ParamValue1</ParameterValue>
              <ParameterUnits>ParamUnits1</ParameterUnits>
           <OptionalParamter> 
           <OptionalParameter>
              <ParameterName>ParamName2</ParameterName>
              <ParameterValue>ParamValue2</ParameterValue>
              <ParameterUnits>ParamUnits2</ParameterUnits>
           <OptionalParamter>
           <OptionalParameter>
              <ParameterName>ParamName3</ParameterName>
              <ParameterValue>ParamValue3</ParameterValue>
              <ParameterUnits>ParamUnits3</ParameterUnits>
           <OptionalParamter>
        </OptionalParamters>
    <DataItem>
</DataItems>

我想以一种可以给我一个表格行的方式展平它

(ID, Metric1, Metric2, ParamName, ParamValue, ParamUnits)

问题是我不知道如何执行我需要的动态过滤以消除在内部连接或交叉应用期间产生的无效行。所以我基本上总共有 (Number of Data Items)^2 行,其中包含参数名称、值和单位的所有排列。我想知道如何过滤掉无效的行。

4

1 回答 1

0

我认为你的 XML 搞砸了。您有一堆没有匹配关闭元素的开放XML元素。如果你解决了这个问题,那么很容易得到你想要的扁平化输出:

declare @idoc int, @xml varchar(max) = '
<?xml version="1.0" encoding="utf-8"?>
<DataItems>
  <DataItem>
    <ID>ID1</ID>
    <Metric1>Metric11Value</Metric1>
    <Metric2>Metric12Value</Metric2>
    <OptionalParameters>
      <OptionalParameter>
        <ParameterName>ParamName1</ParameterName>
        <ParameterValue>ParamValue1</ParameterValue>
        <ParameterUnits>ParamUnits1</ParameterUnits>
      </OptionalParameter>
    </OptionalParameters>
    <OptionalParameters>
      <OptionalParameter>
        <ParameterName>ParamName2</ParameterName>
        <ParameterValue>ParamValue2</ParameterValue>
        <ParameterUnits>ParamUnits2</ParameterUnits>
      </OptionalParameter>
    </OptionalParameters>
    <OptionalParameters>
      <OptionalParameter>
        <ParameterName>ParamName3</ParameterName>
        <ParameterValue>ParamValue3</ParameterValue>
        <ParameterUnits>ParamUnits3</ParameterUnits>
      </OptionalParameter>
    </OptionalParameters>
  </DataItem>
  <DataItem>
    <ID>ID2</ID>
    <Metric1>Metric21Value</Metric1>
    <Metric2>Metric22Value</Metric2>
    <OptionalParameters>
      <OptionalParameter>
        <ParameterName>ParamName1</ParameterName>
        <ParameterValue>ParamValue1</ParameterValue>
        <ParameterUnits>ParamUnits1</ParameterUnits>
      </OptionalParameter>
    </OptionalParameters>
    <OptionalParameters>
      <OptionalParameter>
        <ParameterName>ParamName2</ParameterName>
        <ParameterValue>ParamValue2</ParameterValue>
        <ParameterUnits>ParamUnits2</ParameterUnits>
      </OptionalParameter>
    </OptionalParameters>
    <OptionalParameters>
      <OptionalParameter>
        <ParameterName>ParamName3</ParameterName>
        <ParameterValue>ParamValue3</ParameterValue>
        <ParameterUnits>ParamUnits3</ParameterUnits>
      </OptionalParameter>
    </OptionalParameters>
  </DataItem>
</DataItems>'

exec sp_xml_preparedocument @idoc output, @xml

select *
from   openxml(@idoc, '/DataItems/DataItem/OptionalParameters/OptionalParameter', 1)
with   (
          ID varchar(5) '../../ID', 
          Metric1 varchar(18) '../../Metric1', 
          Metric2 varchar(20) '../../Metric2', 
          ParamName varchar(20) 'ParameterName', 
          ParameterValue varchar(20) 'ParameterValue',
          ParameterUnits varchar(20) 'ParameterUnits'
        )

exec sp_xml_removedocument @idoc
go

这会返回:

ID    Metric1            Metric2              ParamName            ParameterValue       ParameterUnits
----- ------------------ -------------------- -------------------- -------------------- --------------------
ID1   Metric11Value      Metric12Value        ParamName1           ParamValue1          ParamUnits1
ID1   Metric11Value      Metric12Value        ParamName2           ParamValue2          ParamUnits2
ID1   Metric11Value      Metric12Value        ParamName3           ParamValue3          ParamUnits3
ID2   Metric21Value      Metric22Value        ParamName1           ParamValue1          ParamUnits1
ID2   Metric21Value      Metric22Value        ParamName2           ParamValue2          ParamUnits2
ID2   Metric21Value      Metric22Value        ParamName3           ParamValue3          ParamUnits3
于 2012-10-22T22:54:00.383 回答