SQL Server和XML利用率

时间:2016-07-28 06:41:37

标签: sql-server xml

我正在尝试将XML与SQL Server一起使用。我所要做的就是打印出所有三位客人。当我运行我的代码时,它只显示第一个客人信息的打印件,我需要打印所有三个客人的信息。我做错了什么?

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

3 个答案:

答案 0 :(得分:0)

而是xml文档尝试使用xquery,

 $request = new GetRequest();
 $request->baseRef = new RecordRef();
 $request->baseRef->type = $type;  //Record Type
 $request->baseRef->internalId = $internalId; //Internal ID of record

 $getResponse = $service->get($request);
 if ( ! $getResponse->readResponse->status->isSuccess) {
     return 'ERROR';
 } else {
     return $getResponse->readResponse->record;
 }
不过,你在顶部给出的选择查询不会产生你在下面给出的相同的xml。

答案 1 :(得分: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

答案 2 :(得分: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'
)