2011-10-25 16 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參數的最好方法是什麼?

編輯

我想我需要表達我的回報我期待在這裏。下面的腳本代碼是表什麼,我需要在這裏:

對於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節點。還有,我有多少個節點,我在這裏有很多表格行。

至於應該怎麼看,看下面的圖片:

enter image description here

其實,這個代碼是四星級酒店搜索查詢。所以,我需要 來處理我從XML參數獲得的這些值來查詢我的表 並返回可用房間。我說這個,因爲它可以幫助你們看到它通過 。我不是在尋找 房間預訂系統的完整代碼。那太自私了。

+0

@marc_s感謝的標題觸摸。我不確定這是一個好題目。如果您可以提供更好的標題,請隨時更改它。 – tugberk

+0

你想讓參數目標表看起來像什麼?你關心孩子的信息,或者每個房間的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

這應該讓你接近:

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

d'oh;錯過了頁面刷新:) –

+0

謝謝!我已經知道了,但感謝你的努力:) – tugberk

相關問題