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)

The problem is that I don't know how do peform the dynamic filtering I need in order to eliminate the invalid rows that result during the inner join or cross apply. So what I have essentially a total of (Number of Data Items)^2 of rows with all the permutations of parameters names, values, and units. I want to know how to filter out the invalid rows.

4

1 に答える 1

0

あなたのXMLはめちゃくちゃだと思います。一致するclose要素を持たない多数のopenXML要素があります。これを修正すると、必要なフラット化された出力を簡単に取得できます。

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 に答える