XQuery против OpenXML в SQL Server - PullRequest
       13

XQuery против OpenXML в SQL Server

2 голосов
/ 04 августа 2010

У меня есть этот XML в таблице SQL Server:

<root>
  <meetings>
    <meeting>
      <id>111</id>
      <participants>
        <participant><name>Smith</name></participant>
        <participant><name>Jones</name></participant>
        <participant><name>Brown</name></participant>
      </participants>
    </meeting>
    <meeting>
      <id>222</id>
      <participants>
        <participant><name>White</name></participant>
        <participant><name>Bloggs</name></participant>
        <participant><name>McDonald</name></participant>
      </participants>
    </meeting>
  </meetings>
</root>

И я хочу получить такой набор результатов:

MeetingID    Name
111          Smith
111          Jones
111          Brown
222          White
222          Bloggs
222          McDonald

Это просто с помощью select from openxml, но мне не удалось использоватьXQuery.Может ли кто-нибудь помочь мне там, и, возможно, также дать плюсы и минусы для любого метода?

Ответы [ 2 ]

4 голосов
/ 04 августа 2010

После того, как вы исправили неверный XML (элементы <name> должны заканчиваться тегом </name>), вы сможете использовать это:

SELECT 
    Meetings.List.value('(id)[1]', 'int') AS 'Meeting ID',
    Meeting.Participant.value('(name)[1]', 'varchar(50)') AS 'Name'
FROM
    @input.nodes('/root/meetings/meeting') AS Meetings(List)
CROSS APPLY
    Meetings.List.nodes('participants/participant') AS Meeting(Participant)

По сути, первый вызов .nodes() дает вам псевдотаблица всех <meeting> узлов, из которых я извлекаю ID собрания.

Второй .nodes() вызов этого тега <meeting> копает глубже в список <participants>/<participant> подузлов и извлекает имя из этих узлов.

1 голос
/ 09 августа 2010

Это может дать вам вывод на основе таблицы XQuery.

(: Assume $x is your Xml Content. so :)
let $x := Assign your Xml Content.
let $d1:= <table border="1"><tr><td>Meeting</td><td> Participant</td></tr>
  { for $p in $x//meeting/participants/participant 
              return element{'tr'} {
                    element{'td'} {$p/parent::*/parent::*/id/text()},
                    element{'td'} {data($p)}                        
                }
          }

   </table>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...