2015-07-13 39 views
0

我希望得到<TicketHeader>元素從我的XML值(CreatedRecordLocator),但我不能採取一些值從XML在SQL Server 2008

我的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> 

和我的sql代碼像tihs:

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 




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" 
    TicketNo=ColTicketNo.value('@No','varchar(50)'), 
    TicketStatus = ColTicketStatus.value('@Status','varchar(50)') , 
    TicketType = ColTicketType.value('@Type','varchar(50)') , 
    TicketSignInBooking = ColTicketSignInBooking.value('@SignInBooking','varchar(6)'), 
    TicketReissueNo = ColTicketReissueNo.value('@ReissueNo','varchar(6)'), 
    TicketHeaderTicketing = ColHeaderTicketing.value('@Ticketing','date'), 
    TicketHeaderVoid = ColHeaderTicktVoid.value('@Void','varchar(50)'), 
    TicketHeaderCreated = ColHeaderCreated.value('(Created/text())[1]','datetime'), 
    TicketHeaderRecordLocator = ColHeaderRecordLocator.value('@RecordLocator','varchar(6)'), 
    TicketHeaderBooking = ColHeaderTicktBooking.value('@Booking','varchar(50)'), 
    TicketHeaderTicketing = ColHeaderTicktTicketing.value('@Ticketing','varchar(50)'), 
    TicketHeaderContacts = ColHeaderContacts.value('(Contacts)[1]','varchar(max)'), 
    Currency = Currency.value('@Currency','varchar(5)'), 
    Value = Value.value('@Value','decimal(18,2)'), 
    RateHRK = RateHrk.value('(Rate)[1]','decimal(18,2)') 



    -- TicketHeaderRecordLocator = ColHeaderRecordLocator.value('(RecordLocator)[1]','varchar(6)')   
FROM 
    _GoLink_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(ColTicketStatus) 
    CROSS APPLY 
    XmlData.nodes('Main/Tickets/Ticket') AS XT3(ColTicketNo) 
    CROSS APPLY 
    XmlData.nodes('Main/Tickets/Ticket') AS XT4(ColTicketType) 
    CROSS APPLY 
    XmlData.nodes('Main/Tickets/Ticket') AS XT5(ColTicketSignInBooking) 
    CROSS APPLY 
    XmlData.nodes('Main/Tickets/Ticket') AS XT6(ColTicketReissueNo) 
    CROSS APPLY 
    XmlData.nodes('Main/Tickets/Ticket/TicketHeader/History') AS XT7(ColHeaderTicketing) 
    CROSS APPLY 
    XmlData.nodes('Main/Tickets/Ticket/TicketHeader/History') AS XT8(ColHeaderTicktVoid) 
    CROSS APPLY 
    XmlData.nodes('Main/Tickets/Ticket/TicketHeader/Created') AS XT9(ColHeaderCreated) 
    CROSS APPLY 
    XmlData.nodes('Main/Tickets/Ticket/TicketHeader/RecordLocator') AS XT10(ColHeaderRecordLocator) 
    CROSS APPLY 
    XmlData.nodes('Main/Tickets/Ticket/TicketHeader/OfficeID') AS XT11(ColHeaderTicktBooking) 
    CROSS APPLY 
    XmlData.nodes('Main/Tickets/Ticket/TicketHeader/OfficeID') AS XT12(ColHeaderTicktTicketing) 
    CROSS APPLY 
    XmlData.nodes('Main/Tickets/Ticket/TicketHeader/Contacts') AS XT13(ColHeaderContacts) 
     CROSS APPLY 
    XmlData.nodes('Main/Tickets/Ticket/TicketHeader/Rate') AS XT14(Currency) 
     CROSS APPLY 
    XmlData.nodes('Main/Tickets/Ticket/TicketHeader/Rate') AS XT15(Value) 
    CROSS APPLY 
    XmlData.nodes('Main/Tickets/Ticket/TicketHeader/RateHRK') AS XT16(RateHrk) 

但沒有結果,任何人都可以幫助解決這個問題嗎?

感謝


現在我讀整個XML和我的查詢是這樣:

SELECT 
    ExportDate = ColExport.value('(Date)[1]', 'date') , 
    ExportTime = ColExport.value('(Time)[1]', 'char(10)'), 
    ExportFromDate = ColExport.value('(FromDate)[1]', 'date'), 
    ExportToDate = ColExport.value('(ToDate)[1]', 'date'), 
    -- use the @Status to get the XML attribute (not element!) for "Status" 
    TicketNo=ColTicketHeader.value('@No','varchar(50)'), 
    TicketStatus = ColTicketHeader.value('@Status','varchar(50)') , 
    TicketType = ColTicketHeader.value('@Type','varchar(50)') , 
    TicketSignInBooking = ColTicketHeader.value('@SignInBooking','varchar(6)'), 
    TicketReissueNo = ColTicketHeader.value('@ReissueNo','varchar(6)'), 
    TicketHeaderTicketing = ColHisotry.value('@Ticketing','date'), 
    TicketHeaderVoid = ColHisotry.value('@Void','varchar(50)'), 
    TicketHeaderCreated = ColTicketHeaderr.value('(Created)[1]','datetime'), 
    TicketHeaderRecordLocator = ColTicketHeaderr.value('(RecordLocator)[1]', 'varchar(25)'), 
    TicketStatus = ColTicketHeaderr.value('(TicketStatus)[1]', 'varchar(25)'), 
    TermiID = ColTicketHeaderr.value('(TermID)[1]', 'varchar(25)'), 
    PNRCreationDate = ColTicketHeaderr.value('(PNRCreationDate)[1]', 'date'), 
    BookingOffice = ColOfficeID.value('@Booking','varchar(50)'), 
    TicketingOffice = ColOfficeID.value('@Ticketing','varchar(50)'), 
    Routing = ColTicketHeaderr.value('(Routing)[1]', 'varchar(100)'), 
    AirlineName = ColTicketHeaderr.value('(ValidAirlineName)[1]', 'varchar(100)'), 
    AirlineCode = ColTicketHeaderr.value('(ValidatingCarrier)[1]', 'varchar(5)'), 
    Currency = ColRate.value('@Currency','varchar(5)'), 
    Value = ColRate.value('@Value','decimal(18,2)'), 
    RateHRK = ColTicketHeaderr.value('(RateHRK)[1]', 'decimal(18,2)'), 
    ConvertationRate = ColTicketHeaderr.value('(ConvertationRate)[1]', 'decimal(18,4)'), 
    Comission = ColTicketHeaderr.value('(Comission)[1]', 'varchar(50)'), 
    FOP = ColTicketHeaderr.value('(FP)[1]', 'varchar(50)'), 
    ServiceFee = ColSFee.value('@Main','decimal(18,2)'), 
    Discount = ColTicketHeaderr.value('(Discount)[1]', 'decimal(18,2)'), 
    AirlinePayTotal = ColTicketHeaderr.value('(AirlinePayTotal)[1]', 'varchar(20)'), 
    TaxCurr = ColTax.value('@Curr','varchar(5)'), 
    TaxValue = ColTax.value('@Value','decimal(18,2)'), 
    OrderNo= ColPax.value('@No','int'), 
    OrderLastName= ColPax.value('@LastName','varchar(100)'), 
    OrderFirstName= ColPax.value('@FirstName','varchar(100)'), 
    [No]= ColAirSegment.value('@No','int'), 
    BookingClass= ColAirSegment.value('@Class','varchar(5)'), 
    FlightNO = ColAirSegment.value('(FlightNo)[1]', 'varchar(20)'), 
    FlightDurationTime = ColAirSegment.value('(FlightDurationTime)[1]', 'varchar(20)'), 
    GeographicalMileage = ColAirSegment.value('(GeographicalMileage)[1]', 'varchar(20)'), 
    Meal = ColAirSegment.value('(Meal)[1]', 'varchar(5)'), 
    DepartureDate = ColDeparture.value('@Date','date'), 
    DepartureTime = ColDeparture.value('@Time','char(10)'), 
    ArrivalDate = ColArrival.value('@Date','date'), 
    ArrivalTime = ColArrival.value('@Time','char(10)'), 
    BoardCity = ColBoard.value('@City','varchar(50)'), 
    BoardCityCode = ColBoard.value('@Point','varchar(50)'), 
    OffCity = ColOff.value('@City','varchar(50)'), 
    OffCityCode = ColOff.value('@Point','varchar(50)'), 
    BaggageAllowance= ColAirSegment.value('(BaggageAllowance)[1]', 'varchar(20)') 

FROM 
    _GoLink_Xml 
    CROSS APPLY 

    XmlData.nodes('Main/Export') AS XT1(ColExport) 
    CROSS APPLY 

    XmlData.nodes('Main/Tickets/Ticket') AS XT2(ColTicketHeader) 
     CROSS APPLY 
    XmlData.nodes('Main/Tickets/Ticket/TicketHeader/History') AS XT3(ColHisotry) 
     CROSS APPLY 
    XmlData.nodes('Main/Tickets/Ticket/TicketHeader') AS XT4(ColTicketHeaderr) 
    CROSS APPLY 
    XmlData.nodes('Main/Tickets/Ticket/TicketHeader/OfficeID') AS XT5(ColOfficeID) 
     CROSS APPLY 
    XmlData.nodes('Main/Tickets/Ticket/TicketHeader/Rate') AS XT6(ColRate) 
     CROSS APPLY 
    XmlData.nodes('Main/Tickets/Ticket/TicketHeader/ServiceFee') AS XT7(ColSFee) 
     CROSS APPLY 
    XmlData.nodes('Main/Tickets/Ticket/TicketHeader/Taxes') AS XT8(ColTax) 
     CROSS APPLY 
    XmlData.nodes('Main/Tickets/Ticket/NE') AS XT9(ColPax) 
     CROSS APPLY 
    XmlData.nodes('Main/Tickets/Ticket/AirSegments/AirSegment') AS XT10(ColAirSegment) 
     CROSS APPLY 
    XmlData.nodes('Main/Tickets/Ticket/AirSegments/AirSegment/Departure') AS XT11(ColDeparture) 
     CROSS APPLY 
    XmlData.nodes('Main/Tickets/Ticket/AirSegments/AirSegment/Arrival') AS XT12(ColArrival) 
      CROSS APPLY 
    XmlData.nodes('Main/Tickets/Ticket/AirSegments/AirSegment/Board') AS XT13(ColBoard) 
     CROSS APPLY 
    XmlData.nodes('Main/Tickets/Ticket/AirSegments/AirSegment/Off') AS XT14(ColOff) 

爲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>from 

      <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> 

我有32條記錄,有的記錄是多重的,我需要把一些截然不同的東西 另外計劃是把一些信息放在附加表中... 也許你有答案嗎? 謝謝

回答

2

應該是非常直接的(如果你有有效的XML - 你張貼的是無效的)。

嘗試這樣:

SELECT 
    ColTicketHeader.value('(RecordLocator)[1]', 'varchar(25)'), 
    ColTicketHeader.value('(Created)[1]', 'datetime') 
FROM 
    _GoLink_Xml 
CROSS APPLY 
    XmlData.nodes('Main/Tickets/Ticket/TicketHeader') AS XT7(ColTicketHeader) 

另外:爲什麼地球上你交叉應用相同的XPath多次?

CROSS APPLY 
    -- the nodes <Main>/<Tickets>/<Ticket> have ticket-related data 
    XmlData.nodes('Main/Tickets/Ticket') AS XT2(ColTicketStatus) 
CROSS APPLY 
    XmlData.nodes('Main/Tickets/Ticket') AS XT3(ColTicketNo) 
CROSS APPLY 
    XmlData.nodes('Main/Tickets/Ticket') AS XT4(ColTicketType) 
CROSS APPLY 
    XmlData.nodes('Main/Tickets/Ticket') AS XT5(ColTicketSignInBooking) 
CROSS APPLY 
    XmlData.nodes('Main/Tickets/Ticket') AS XT6(ColTicketReissueNo) 

這使得毫無意義 - 只需使用

CROSS APPLY 
    XmlData.nodes('Main/Tickets/Ticket') AS XT2(ColTicket) 

,然後讓你需要從<Ticket>指這一項的所有細節,單XT2(ColTicket)僞表/列 - 會讓你的T-SQL 更簡單,更容易理解!

+0

謝謝marc_s ..這是真的所有你說的話 –