2

我有以下xml。

declare @x xml = '
<Cols>
    <Col><Name>A</Name></Col>
    <Col><Name>B</Name></Col>
    <Col><Name>C</Name></Col>
    <Col><Name>D</Name></Col>
</Cols>
<Values>
    <A>1</A>
    <B>2</B>
    <C>3</C>
    <D>4</D>
</Values>
';

如何编写select @x.query('......')将其转换为

<Cols>
    <Col><Name>A</Name><Value>1</Value></Col>
    <Col><Name>B</Name><Value>2</Value></Col>
    <Col><Name>C</Name><Value>3</Value></Col>
    <Col><Name>D</Name><Value>4</Value></Col>
</Cols>
4

2 回答 2

2

似乎以下正在做您需要的事情:

select @x.query('
    element Cols {
      for $c in /Cols/Col
        return
          <Col>
           { $c/Name }
           { element Value { text {/Values/*[local-name()=$c/Name/text()[1]]} } }
          </Col>
    }
  ');
于 2013-09-13T20:57:50.767 回答
2

根本不需要考虑列名,我们需要的一切都包含在<Values/>

for $value in //Values/*
return element Col {
  element Name { local-name($value) },
  element Value { $value/node() }
}
于 2013-09-13T21:02:10.007 回答