Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Запрос к XML  [new]
alex.daymon
Member

Откуда:
Сообщений: 7
Имеется следующий код:

DECLARE @idoc int
DECLARE @doc varchar(1000)
SET @doc ='
<periodicity>
  <period freq="weekly" interval="1" />
  <dows>
    <dow setpos="1">2</dow>
    <dow setpos="-1">4</dow>
  </dows>
  <doms>
    <dom>12</dom>
    <dom>15</dom>
    <dom>21</dom>
  </doms>
  <months>
    <month>2</month>
    <month>4</month>
  </months>
</periodicity>'

EXEC sp_xml_preparedocument @idoc OUTPUT, @doc

SELECT *
FROM   OPENXML (@idoc, '/periodicity')
         WITH (freq        char(7)     'period/@freq',
               interval    int         'period/@interval',
               dow         int         'dows/dow',
               setpos      int         'dows/dow/@setpos',
               dom         int         'doms/dom',
               month       int         'months/month')
GO

Результат запроса:

freq interval dow setpos dom month
weekly 1 2 1 12 2

Необходимо чтобы возвращался весь набор данных, с учетом того, что количество вложенных элементов (dow, dom, month) может быть различным. Т.е. должы возвращаться все возможные комбинации dow, dom, month с остальными элементами. Например, для данного набора должно вернуться:

freq       interval dow  setpos     dom      month
weekly       1       2       1       12       2
weekly       1       2       1       15       2
weekly       1       2       1       21       2
weekly       1       4       1       12       2
weekly       1       4       1       15       2
weekly       1       4       1       21       2
weekly       1       2       1       12       4
weekly       1       2       1       15       4
weekly       1       2       1       21       4
weekly       1       4       1       12       4
weekly       1       4       1       15       4
weekly       1       4       1       21       4

Собственно вопрос: как это сделать?


There are 10 types of people: those who understand binary and those who don't.
17 май 11, 22:01    [10668009]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к XML  [new]
iljy
Member

Откуда:
Сообщений: 8711
alex.daymon,

а какие проблемы? Получаете 3 отдельных набора (отдельно для dow, для dom и для month), а потом cross join их.
17 май 11, 22:07    [10668040]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к XML  [new]
alex.daymon
Member

Откуда:
Сообщений: 7
iljy,

Спасибо, попробую. Честно говоря, никогда не приходилось использовать join, поэтому и не вспомнил про него.. Да и мозг уже кипеть начинает )
17 май 11, 22:10    [10668052]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к XML  [new]
alex.daymon
Member

Откуда:
Сообщений: 7
alex.daymon
iljy,

Спасибо, попробую. Честно говоря, никогда не приходилось использовать join, поэтому и не вспомнил про него.. Да и мозг уже кипеть начинает )


Пипец, наверно действительно пора спать. Затуманенный мозг перепутал join с union...
17 май 11, 22:22    [10668126]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к XML  [new]
alex.daymon
Member

Откуда:
Сообщений: 7
Сделал таки, правда пришлось поменять структуру xml:

DECLARE @idoc int
DECLARE @doc varchar(1000)
SET @doc ='
<periodicity>
  <period freq="weekly" interval="1" />
  <dows>
    <dow setpos="1" dow="2" />
    <dow setpos="-1" dow="4" />
  </dows>
  <doms>
    <dom dom="1"/>
    <dom dom="4"/>
    <dom dom="5"/>
  </doms>
  <months>
    <month month="2" />
    <month month="4" />
  </months>
</periodicity>'

EXEC sp_xml_preparedocument @idoc OUTPUT, @doc

SELECT *
FROM   OPENXML (@idoc, '/periodicity/period')
         WITH (freq        char(7)     '@freq',
               interval    int         '@interval')
CROSS JOIN
   OPENXML (@idoc, '/periodicity/dows/dow')
         WITH (dow         int         '@dow',
               setpos      int         '@setpos')              

CROSS JOIN
   OPENXML (@idoc, '/periodicity/doms/dom')
         WITH (dom         int         '@dom')
               
CROSS JOIN
   OPENXML (@idoc, '/periodicity/months/month')
         WITH (month       int         '@month')

GO

С предыдущей структурой никак не мог получить все записи, возвращалась только первая.. ( Ну а теперь все работает.
17 май 11, 23:00    [10668304]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить