2011-10-25 6 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 값

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

, 아래 삽입 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

@marc_s 덕분에. 나는 그것이 여기 좋은 제목인지 확신하지 못한다. 더 나은 타이틀을 제공 할 수 있다면 pls로 자유롭게 변경하십시오. – 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

도오리; 페이지 새로 고침을 놓친 :) –

+0

감사합니다! 나는 이미 당신이 볼 수 있지만 노력을 주셔서 감사합니다 :) – tugberk

관련 문제