SQL Server из параметра XML в таблицу - работа с необязательными дочерними узлами - PullRequest
3 голосов
/ 25 октября 2011

В SQL Server 2008 R2 я пытаюсь прочитать значение XML в виде таблицы.

Пока я здесь:

DECLARE @XMLValue AS XML;
SET @XMLValue = '<SearchQuery>
    <ResortID>1453</ResortID>
    <CheckInDate>2011-10-27</CheckInDate>
    <CheckOutDate>2011-11-04</CheckOutDate>
    <Room>
        <NumberOfADT>2</NumberOfADT>
        <CHD>
            <Age>10</Age>
        </CHD>
        <CHD>
            <Age>12</Age>
        </CHD>
    </Room>
    <Room>
        <NumberOfADT>1</NumberOfADT>
    </Room>
    <Room>
        <NumberOfADT>1</NumberOfADT>
        <CHD>
            <Age>7</Age>
        </CHD>
    </Room>
</SearchQuery>';

SELECT 
    Room.value('(NumberOfADT)[1]', 'INT') AS NumberOfADT
FROM @XMLValue.nodes('/SearchQuery/Room') AS SearchQuery(Room);

Как видите, Room узел иногда получает CHD дочерних узлов, но иногда нет.

Предположим, что я получаю это значение XML в качестве параметра хранимой процедуры. Итак, мне нужно работать со значениями для запроса таблиц моей базы данных. Как лучше всего полностью прочитать этот параметр XML?

EDIT

Я думаю, мне нужно выразить то, что я ожидаю взамен здесь. Ниже приведен код скрипта для таблицы, что мне нужно здесь:

DECLARE @table AS TABLE(
    ResorrtID INT,
    CheckInDate DATE,
    CheckOutDate DATE,
    NumberOfADT INT,
    CHDCount INT,
    CHDAges NVARCHAR(100)
);

Для значения XML, которое я предоставил выше, подходит следующая вставка t-sql:

INSERT INTO @table VALUES(1453, '2011-10-27', '2011-11-04', 2, 2, '10;12');
INSERT INTO @table VALUES(1453, '2011-10-27', '2011-11-04', 1, 0, NULL);
INSERT INTO @table VALUES(1453, '2011-10-27', '2011-11-04', 1, 1, '7');

CHDCount - для количества узлов CHD в узле Room. Кроме того, сколько у меня Room узлов, столько строк таблицы у меня здесь.

Что касается того, как это должно выглядеть, см. Рисунок ниже:

enter image description here

На самом деле этот код предназначен для запроса бронирования отелей. Итак, мне нужно работать с этими значениями я получил из параметра XML для запроса моих таблиц и вернуть свободные номера. Я говорю это, потому что, возможно, это помогает Вы, ребята, чтобы увидеть это до конца. Я не ищу полный код для система бронирования номеров. Это было бы так эгоистично.

Ответы [ 2 ]

2 голосов
/ 25 октября 2011
select S.X.value('ResortID[1]', 'int') as ResortID,
       S.X.value('CheckInDate[1]', 'date') as CheckInDate,
       S.X.value('CheckOutDate[1]', 'date') as CheckOutDate,
       R.X.value('NumberOfADT[1]', 'int') as NumberOfADT,
       R.X.value('count(CHD)', 'int') as CHDCount,
       stuff((select ';'+C.X.value('.', 'varchar(3)')
              from R.X.nodes('CHD/Age') as C(X)
              for xml path('')), 1, 1, '') as CHDAges
from @XMLValue.nodes('/SearchQuery') as S(X)
  cross apply S.X.nodes('Room') as R(X)
1 голос
/ 25 октября 2011

Это должно приблизить вас:

SELECT  ResortID = @xmlvalue.value('(//ResortID)[1]', 'int')
      , CheckInDate = @xmlvalue.value('(//CheckInDate)[1]', 'date')
      , CheckOutDate = @xmlvalue.value('(//CheckOutDate)[1]', 'date')
      , NumberOfAdt = Room.value('(NumberOfADT)[1]', 'INT')
      , CHDCount = Room.value('count(./CHD)', 'int')
      , CHDAges = Room.query('for $c in ./CHD
                        return concat(($c/Age)[1], ";")').value('(.)[1]',
                                                              'varchar(100)')
FROM    @XMLValue.nodes('/SearchQuery/Room') AS SearchQuery ( Room ) ; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...