2016-07-28 5 views
0

Я пытаюсь использовать XML с SQL Server. Все, что я пытаюсь сделать, это распечатать всех трех гостей. Когда я запускаю свой код, он показывает только распечатку информации первого гостя, и мне нужно распечатать всю информацию о трех гостях. Что я делаю не так?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-документ, попробовать его с XQuery,

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 

BTW, выберите запрос, который вы дали на вершине не будет производить тот же XML, который вы дали ниже.

0

@ Ответ на вопрос хорошо, вы можете использовать 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' 
)