我有这样的情况:
CREATE TABLE _GoLink_Xml
(
RecordId INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
XmlData XML NOT NULL
)
GO
INSERT INTO _GoLink_Xml(XmlData)
SELECT *
FROM OPENROWSET(
BULK 'C:\golink_0607.xml', SINGLE_BLOB)
AS ImportSource
GO
XML看起来像这样
<Main>
<Export>
<Date>2015-07-06</Date>
<Time>11:57:39</Time>
<FromDate>2015-07-06</FromDate>
<ToDate>2015-07-06</ToDate>
</Export>
<Tickets>
<Ticket No="831-9275972480" Status="Issued" Type="Electron" SignInBooking="3OSWS" SignInTicketing="72" ReissueNo="">
<TicketHeader>
<History Ticketing="2015-07-06" Void="" Refund="" Reissue="" />
<Created>2015-07-06 11:29:00</Created>
<Modified />
<ModifiedBy />
<ClientCompanyName />
<ClientNumber />
<DistrubutorName />
<DistributorNumber />
<RecordLocator>RK3HDW</RecordLocator>
<Subagent />
<Interline>N</Interline>
<TicketStatus>OK</TicketStatus>
<TKTcoupons />
<GlobalCouponStatus />
<TermID>BDB7F9</TermID>
<MIRdev>FED02B</MIRdev>
<TransBeforeTKT>016</TransBeforeTKT>
<AutoPrice>N</AutoPrice>
<BookedDirectly>N</BookedDirectly>
<FrequentFlyer />
<FareCalc>ZAG OU DBV 92.00OU ZAG 92.00 HRK184.00END XT 125.00ZS110.00YQ</FareCalc>
<Routing>ZAG-DBV-ZAG</Routing>
<ItineraryIndicator>D</ItineraryIndicator>
<PNRCreationDate>2015-07-03</PNRCreationDate>
<OfficeID Booking="3OS " TR="" Ticketing="3OS " />
<Contacts>ZAGN*385915885134__ZAGT*00385 1 6329-100 AVIOKARTE.HR-IP__ZAGE*AVIOKARTE//AVIOKARTE.HR</Contacts>
<TktAgentTitle />
<TktOfficeTitle>3OS</TktOfficeTitle>
<BookingOfficeTitle>3OS</BookingOfficeTitle>
<IATA>75321164</IATA>
<ValidAirlineName>CROATIA AIRLINES</ValidAirlineName>
<ValidatingCarrier>OU</ValidatingCarrier>
<Rate Currency="HRK" Value="184.00" />
<RateHRK>0.00</RateHRK>
<ConvertationRate>0.0000</ConvertationRate>
<TourCode />
<Comission>0.00A</Comission>
<CommisAmt Curr="HRK" Value="0.00" />
<FP>INVOICE</FP>
<CreditCard />
<AirRecLoc>1A-8FDQTV</AirRecLoc>
<Endorsement>OU ONLY/ /REFUND NOT PERMITTED/ </Endorsement>
<Amount>635.00</Amount>
<ServiceFee Main="0.00" VAT="0.00" />
<Discount>0.00</Discount>
<ClientToPay>0.00</ClientToPay>
<AirlinePayTotal>635,00</AirlinePayTotal>
<NetEarnedExclTaxes>0,00</NetEarnedExclTaxes>
<AgentCountry>HR </AgentCountry>
<Remarks>
<Remark />
<Remark1 />
<Remark2>DI.FA2: DI.FA3: IGOR DI.FA4: JURISIC DI.FA5: OGRIZOVICEVA 34 DI.FA6: 10000 DI.FA7: ZAGREB DI.FA8: HR DI.FA9: BT DI.FA10: 03072015 DI.FA13: 385915885134 DI.FA20: DI.FA21: HRK 368 902 40 DI.FA30: UHR </Remark2>
<Remark3 />
</Remarks>
<Taxes Curr="HRK" Value="451.00">
<Tax Curr="HRK" Value="206.00" TC="HR" NC="" />
<Tax Curr="HRK" Value="10.00" TC="MI" NC="" />
<Tax Curr="HRK" Value="110.00" TC="YQ" NC="" />
<Tax Curr="HRK" Value="125.00" TC="ZS" NC="" />
</Taxes>
<CarrierTKTFees />
</TicketHeader>
<NE No="1" LastName="JURISIC" FirstName="IGORMR" Title="" text="ADT" />
<AirSegments>
<AirSegment No="01" Class="U">
<ServicingCarrier>OU</ServicingCarrier>
<ServicingCarrierName>CROATIA AIRLINES</ServicingCarrierName>
<OpratingCarrierName />
<FlightNo>660</FlightNo>
<SeatNumber />
<FlightDurationTime>0055</FlightDurationTime>
<GeographicalMileage>00245</GeographicalMileage>
<Meal>N</Meal>
<MealSSR />
<AirClass>U</AirClass>
<Departure Date="2015-10-02" Time="05:50:00" />
<Arrival Date="2015-10-02" Time="06:45:00" />
<Board City="ZAGREB" Point="ZAG" Terminal="" />
<Off City="DUBROVNIK" Point="DBV" Terminal="" />
<FareBasis>UPROM</FareBasis>
<BaggageAllowance>1PC</BaggageAllowance>
<Equipment>319</Equipment>
<WCHR />
<ACRecLoc />
</AirSegment>
<AirSegment No="02" Class="U">
<ServicingCarrier>OU</ServicingCarrier>
<ServicingCarrierName>CROATIA AIRLINES</ServicingCarrierName>
<OpratingCarrierName />
<FlightNo>669</FlightNo>
<SeatNumber />
<FlightDurationTime>0055</FlightDurationTime>
<GeographicalMileage>00245</GeographicalMileage>
<Meal>N</Meal>
<MealSSR />
<AirClass>U</AirClass>
<Departure Date="2015-10-06" Time="21:20:00" />
<Arrival Date="2015-10-06" Time="22:15:00" />
<Board City="DUBROVNIK" Point="DBV" Terminal="" />
<Off City="ZAGREB" Point="ZAG" Terminal="" />
<FareBasis>UPROM</FareBasis>
<BaggageAllowance>1PC</BaggageAllowance>
<Equipment>319</Equipment>
<WCHR />
<ACRecLoc />
</AirSegment>
</AirSegments>
</Ticket>
</Tickets>
</Main>
我的代码是这样的:
SELECT
pref.value('(Date/text())[1]', 'date') as Date,
pref.value('(Time/text())[1]', 'time') as Time,
pref.value('(FromDate/text())[1]', 'date') as FromDate,
pref.value('(ToDate/text())[1]', 'date') as ToDate,
pref.value('(Status/text())[1]','varchar(50)') as Status
FROM
_GoLink_Xml
CROSS APPLY
XmlData.nodes('Main/Export') AS a(pref)
我是这样的:
Date Time FromDate ToDate Status
2015-07-06 11:57:39.000000 2015-07-06 2015-07-06 NULL
如果我使用:
SELECT
pref.value('(Date/text())[1]', 'date') as Date,
pref.value('(Time/text())[1]', 'time') as Time,
pref.value('(FromDate/text())[1]', 'date') as FromDate,
pref.value('(ToDate/text())[1]', 'date') as ToDate,
pref.value('(Status/text())[1]','varchar(50)') as Status
FROM
_GoLink_Xml
CROSS APPLY
XmlData.nodes('Main/Export') AS a(pref)
CROSS APPLY
XmlData.nodes('Tickets/Ticket') AS a(pref)
我一无所获。
有人知道我做错了什么吗?
答案 0 :(得分:0)
您是否通过此代码获得了正确的结果?
SELECT
ExportDate = ColExport.value('(Date)[1]', 'date') ,
ExportTime = ColExport.value('(Time)[1]', 'time'),
ExportFromDate = ColExport.value('(FromDate)[1]', 'date'),
ExportToDate = ColExport.value('(ToDate)[1]', 'date'),
-- use the @Status to get the XML attribute (not element!) for "Status"
TicketStatus = ColTicket.value('@Status','varchar(50)')
FROM
_Go_Link_Xml
CROSS APPLY
-- the nodes <Main>/<Export> have some base data
XmlData.nodes('Main/Export') AS XT1(ColExport)
CROSS APPLY
-- the nodes <Main>/<Tickets>/<Ticket> have ticket-related data
XmlData.nodes('Main/Tickets/Ticket') AS XT2(ColTicket)
我得到了我期待的数据 - 即使XML中有两个<Ticket>
个节点(这是我假设你想要实现的 - 正确吗?)
你的问题是:
你没有合适的XPath来到<Tickets>
- 你错过了<Main>
以下的事实
当你有两个单独的.nodes()
时,你应该不对XML伪表和列使用相同的别名! (AS a(pref)
)为每个案例使用唯一的别名