2011-10-25 1 views
3

SQL Server 2008 R2では、XML値をテーブルとして読み取ろうとしています。XMLパラメータからテーブルへのSQL Server - オプションの子ノードでの作業

はこれまでのところ、私はここにいる:あなたが見ることができるように

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

。以下のスクリプトコードは、私がここで必要なもののテーブルです: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は数のためでありますノード番号がRoomノード以下のCHDノードです。また、どのくらいの数Roomノード、私はここにいる多くのテーブル行。それがどのように見えるべきかについては

、下図を参照してください。

enter image description here

を実際に、このコードは、ホテル予約、検索クエリのためです。だから、私はテーブル を照会し、利用可能な部屋を返すためにXMLパラメータから得たこれらの値を扱うには が必要です。多分それが役に立ったので、私はこれを伝えています あなたはそれを見てみましょう。私は 部屋予約システムの完全なコードを探していません。それはとても利己的です。

+0

を。私はそれがここで良いタイトルであるとは確信していません。より良いタイトルを提供できる場合は、plsを自由に変更してください。 – tugberk

+0

目的地のテーブルの表をどのように表示しますか?子供の情報を気にかけますか、または1部屋あたりのADTの数を減らしますか? NumberofADTは子行の数ですか? –

+0

必要な出力とその使用方法を明確に説明できますか? –

答えて

2
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) 
+0

あなたはあなたがどのように素晴らしい人を知っていますか?どうもありがとう! – tugberk

+0

@tugberk - ようこそ。 –

1

これは、あなたが近づく必要があります。タイトルをタッチしてくれてありがとう@marc_s

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) ; 
+0

もあります。ページリフレッシュを逃した:) –

+0

ありがとう!私はすでにあなたが見ているが、努力のために感謝:) – tugberk

関連する問題