解析从xml到sql的多个不同值

时间:2015-07-07 15:54:51

标签: sql xml

我有这样的情况:

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) 

我一无所获。

有人知道我做错了什么吗?

1 个答案:

答案 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))为每个案例使用唯一的别名