Смешайте XML для родителей и детей в MSSQL - PullRequest
1 голос
/ 16 апреля 2009

Я думаю, что мне нужен CROSS APPLY, но я не могу понять синтаксис. У меня есть набор XML в базе данных MSSQL 2008, который выглядит следующим образом:

<Cookie>
   <id>Chocolate Chip</id>
   <ChocolateChipPeanutButter>
      ...
   </ChocolateChipPeanutButter>

   <ChocolateChipPecan>
      ...
   </ChocolateChipPecan>
</Cookie>

<Cookie>
   <id>Raisin</id>
</Cookie>

<Cookie>
   <id>Coconut</id>
</Cookie>

<Cookie>
   <id>Sugar</id>
</Cookie>

Я пытаюсь разделить XML так, чтобы у меня был набор результатов, который выглядит следующим образом:

Cookie Name                   Cookie SubName
___________                   ______________
Chocolate Chip                <null>
Chocolate Chip                ChocolateChipPeanutButter
Chocolate Chip                ChocolateChipPecan
Raisin                        <null>
Coconut                       <null>
Sugar                         <null>

Я думаю, мне нужно написать что-то вроде этого (предположим, что данные XML хранятся в DECLARE @XMLData XML :

SELECT
     TheXML.TheCookie.query('data(./id)')     AS CookieName
   , TheXML.TheCookie.query('.')              AS CookieData
   , Sub.SubCookieName                        AS SubCookieName
FROM
   @XMLData.nodes('//Cookie') AS TheXML(TheCookie)
CROSS APPLY
   (
       SELECT
          TheCookieXML.SubCookieName.query('local-name(.)')
       FROM
          CookieData.nodes('./*') AS TheCookieXML(SubCookieName)
   )

Я знаю, я знаю, эта XML-схема ужасна из-за того, что я пытаюсь с ней сделать, но давайте предположим, что мы застряли с данными таким образом и работаем оттуда. Я на правильном пути? Будет ли CROSS APPLY когда-нибудь работать так? Может ли даже Бэтмен спасти меня сейчас?

1 Ответ

2 голосов
/ 16 апреля 2009

Попробуйте что-то вроде этого:

SELECT
     TheXML.TheCookie.value('(id[1])', 'varchar(20)') AS CookieName
   , TheXML.TheCookie.query('.') AS CookieData
   , Sub.SubCookie.value('local-name(.)', 'varchar(20)') AS SubCookieName
FROM
   @xmlcon.nodes('//Cookie') AS TheXML(TheCookie)
CROSS APPLY
    TheXML.TheCookie.nodes('./*') as Sub(SubCookie)

Проблема в том, что это также выбирает узел "id": - (

Марк

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