2016-07-28 11 views
0

私はSQL ServerでXMLを利用しようとしています。私がしようとしているのは、3人のゲストすべてをプリントアウトすることだけです。コードを実行すると、最初のゲストの情報だけが印刷され、3人のゲストの情報をすべて印刷する必要があります。私は間違って何をしていますか?SQL ServerとXMLの使用

SELECT Guest.GuestID, GuestFirst, GuestLast, CheckinDate, Nights 
FROM GUEST 
JOIN FOLIO 
ON Guest.GuestID = Folio.GuestID 
FOR XML RAW 

Declare @idoc int 
Declare @xmldoc nvarchar(4000) 


Set @xmldoc = ' 
<ROOT> 
<GUEST> 
<GuestID>4431</GuestID> 
<GuestFirst>Lacey</GuestFirst> 
<GuestLast>Byington</GuestLast> 
<RESERVATIONDETAIL> 
<CheckInDate>2016-08-02</CheckInDate> 
<Nights>2</Nights> 
</RESERVATIONDETAIL> 
</GUEST> 

<GUEST> 
<GuestID>5563</GuestID> 
<GuestFirst>Jonathan</GuestFirst> 
<GuestLast>Langford</GuestLast> 
<RESERVATIONDETAIL> 
<CheckInDate>2016-08-05</CheckInDate> 
<Nights>2</Nights> 
</RESERVATIONDETAIL> 
</GUEST> 

<GUEST> 
<GuestID>6680</GuestID> 
<GuestFirst>Tanner</GuestFirst> 
<GuestLast>Olson</GuestLast> 
<RESERVATIONDETAIL> 
<CheckInDate>2015-09-11</CheckInDate> 
<Nights>3</Nights> 
</RESERVATIONDETAIL> 
</GUEST> 
</ROOT>' 

EXEC sp_xml_preparedocument @idoc OUTPUT, @xmldoc 

SELECT * FROM OPENXML (@idoc, '/ROOT', 3) 
WITH 
(
    GuestID smallint 'GUEST/GuestID', 
    GuestFirst varchar(30) 'GUEST/GuestFirst', 
    GuestLast varchar(30) 'GUEST/GuestLast', 
    CheckinDate smalldatetime 'GUEST/RESERVATIONDETAIL/CheckInDate', 
    Nights tinyint 'GUEST/RESERVATIONDETAIL/Nights' 
) 

EXEC sp_xml_removedocument @idoc 

GO 

答えて

0

代わりにXML文書が

DECLARE @xmldoc XML 

Set @xmldoc = ' 
<ROOT> 
    <GUEST> 
    <GuestID>4431</GuestID> 
    <GuestFirst>Lacey</GuestFirst> 
    <GuestLast>Byington</GuestLast> 
    <RESERVATIONDETAIL> 
     <CheckInDate>2016-08-02</CheckInDate> 
     <Nights>2</Nights> 
    </RESERVATIONDETAIL> 
    </GUEST> 
    <GUEST> 
    <GuestID>5563</GuestID> 
    <GuestFirst>Jonathan</GuestFirst> 
    <GuestLast>Langford</GuestLast> 
    <RESERVATIONDETAIL> 
     <CheckInDate>2016-08-05</CheckInDate> 
     <Nights>2</Nights> 
    </RESERVATIONDETAIL> 
    </GUEST> 
    <GUEST> 
    <GuestID>6680</GuestID> 
    <GuestFirst>Tanner</GuestFirst> 
    <GuestLast>Olson</GuestLast> 
    <RESERVATIONDETAIL> 
     <CheckInDate>2015-09-11</CheckInDate> 
     <Nights>3</Nights> 
    </RESERVATIONDETAIL> 
    </GUEST> 
</ROOT>' 

SELECT 
    a.b.value('GuestID[1]','smallint') AS GuestID, 
    a.b.value('GuestFirst[1]','varchar(30)') AS GuestFirst, 
    a.b.value('GuestLast[1]','varchar(30)') AS GuestLast, 
    a.b.value('RESERVATIONDETAIL[1]/CheckInDate[1]','smalldatetime') AS CheckInDate, 
    a.b.value('RESERVATIONDETAIL[1]/Nights[1]','tinyint') AS Nights 
FROM @xmldoc.nodes('ROOT/GUEST') AS a(b) 

GO 

ところで、あなたは上に与えている選択クエリを使用すると、以下与えた同じXMLを生成しませんが、XQueryのでそれを試してみてください。

0

@Jatin答えが良いです、あなたはxqueryを使うことができます。次のようにOPENXMLを使用することもできます。

EXEC sp_xml_preparedocument @idoc OUTPUT, @xmldoc 

SELECT * FROM OPENXML (@idoc, '/ROOT/GUEST', 3) 
WITH 
(
    GuestID smallint './GuestID', 
    GuestFirst varchar(30) './GuestFirst', 
    GuestLast varchar(30) './GuestLast', 
    CheckinDate smalldatetime './RESERVATIONDETAIL/CheckInDate', 
    Nights tinyint './RESERVATIONDETAIL/Nights' 
) 

EXEC sp_xml_removedocument @idoc 
0

あなたはほぼあります。この小さな変更を行うだけです:

SELECT * FROM OPENXML (@idoc, '/ROOT/*', 3) 
WITH 
(
GuestID smallint 'GuestID', 
GuestFirst varchar(30) 'GuestFirst', 
GuestLast varchar(30) 'GuestLast', 
CheckinDate smalldatetime 'RESERVATIONDETAIL/CheckInDate', 
Nights tinyint 'RESERVATIONDETAIL/Nights' 
) 
関連する問題