2017-03-03 4 views
0

私はちょっと立ち往生しています。私はxmlを持っていて、SQlサーバーにいます。 FBCのすべての値をコンマで区切りたいSQLの代わりにパフォーマンスの問題のためクロス適用

表の名前はTable1です。 xmlが格納されている列の名前はFareDetailsです。 BookingIDとIDを表1

SELECT 
    (PTSD.PSTDNode.value('(FBC)[1]', 'VARCHAR(1024)') + ',') [text()] 
FROM 
    [Table1] 
    CROSS APPLY [FareDetails].nodes('/AirFareInfo/PTSDPFS/PTSD') PTSD(PSTDNode) 
WHERE 
    [BookingID] = 123 
ORDER BY 
    [AirTraveler].ID ASC 
FOR XML PATH ('') 

の他の列です。しかし、私は、DB内万件のレコードを持っており、これは、パフォーマンス上の巨大な通行料を取っています。

のxml:この場合

<AirFareInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" IPFA="false"> 
    <PT>Flight</PT> 
    <FPMID>0</FPMID> 
    <PTID>1</PTID> 
    <FS> 
    <CID>2</CID> 
    <Value>0</Value> 
    </FS> 
    <TF> 
    <CID xsi:nil="true" /> 
    <Value>0</Value> 
    </TF> 
    <VF> 
    <CID>2</CID> 
    <Value>0</Value> 
    </VF> 
    <VD> 
    <CID>2</CID> 
    <Value>0</Value> 
    </VD> 
    <VCR xsi:nil="true" /> 
    <VC> 
    <CID>2</CID> 
    <Value>0</Value> 
    </VC> 
    <VFC> 
    <CID>2</CID> 
    <Value>0</Value> 
    </VFC> 
    <VST /> 
    <VIT /> 
    <AAPFVDR xsi:nil="true" /> 
    <CC> 
    <CID>2</CID> 
    <Value>0</Value> 
    </CC> 
    <D> 
    <CID>2</CID> 
    <Value>514.15</Value> 
    </D> 
    <PD> 
    <CID>2</CID> 
    <Value>0</Value> 
    </PD> 
    <EBF> 
    <CID>2</CID> 
    <Value>0</Value> 
    </EBF> 
    <CST> 
    <DL> 
     <ATRID>13</ATRID> 
     <OB> 
     <CID>2</CID> 
     <Value>74.04</Value> 
     </OB> 
     <OC> 
     <CID>2</CID> 
     <Value>0.00</Value> 
     </OC> 
     <OS> 
     <CID>2</CID> 
     <Value>0.00</Value> 
     </OS> 
     <OF> 
     <CID>2</CID> 
     <Value>50.83</Value> 
     </OF> 
     <OP> 
     <CID>2</CID> 
     <Value>0.00</Value> 
     </OP> 
     <C> 
     <CID>2</CID> 
     <Value>0</Value> 
     </C> 
     <IBF>false</IBF> 
     <D>2014-06-09T14:57:53.521Z</D> 
    </DL> 
    </CST> 
    <CIT /> 
    <CRMR xsi:nil="true" /> 
    <CRM> 
    <CID>2</CID> 
    <Value>0</Value> 
    </CRM> 
    <TL ATC="Tax" PC="" DEN="User Development Fee - Arrival (UDF)"> 
    <TID xsi:nil="true" /> 
    <Amount> 
     <CID>2</CID> 
     <Value>75.00</Value> 
    </Amount> 
    </TL> 
    <TL ATC="Tax" PC="" DEN="Passenger Service Fee"> 
    <TID xsi:nil="true" /> 
    <Amount> 
     <CID>2</CID> 
     <Value>146.00</Value> 
    </Amount> 
    </TL> 
    <TL ATC="Tax" PC="" DEN="User Development Fee - Departure (UDF)"> 
    <TID xsi:nil="true" /> 
    <Amount> 
     <CID>2</CID> 
     <Value>1681.00</Value> 
    </Amount> 
    </TL> 
    <TL ATC="Tax" PC="" DEN="Cute Fee"> 
    <TID xsi:nil="true" /> 
    <Amount> 
     <CID>2</CID> 
     <Value>50.00</Value> 
    </Amount> 
    </TL> 
    <TL ATC="Tax" PC="" DEN="Government Service Tax"> 
    <TID xsi:nil="true" /> 
    <Amount> 
     <CID>2</CID> 
     <Value>151.00</Value> 
    </Amount> 
    </TL> 
    <TL ATC="Tax" PC="" DEN="User Development Fee - Arrival (UDF)"> 
    <TID xsi:nil="true" /> 
    <Amount> 
     <CID>2</CID> 
     <Value>833.00</Value> 
    </Amount> 
    </TL> 
    <TL ATC="Tax" PC="" DEN="Passenger Service Fee"> 
    <TID xsi:nil="true" /> 
    <Amount> 
     <CID>2</CID> 
     <Value>1132.00</Value> 
    </Amount> 
    </TL> 
    <TL ATC="Tax" PC="" DEN="User Development Fee - Departure (UDF)"> 
    <TID xsi:nil="true" /> 
    <Amount> 
     <CID>2</CID> 
     <Value>76.00</Value> 
    </Amount> 
    </TL> 
    <TL ATC="Tax" PC="" DEN="Government Service Tax"> 
    <TID xsi:nil="true" /> 
    <Amount> 
     <CID>2</CID> 
     <Value>148.00</Value> 
    </Amount> 
    </TL> 
    <PTSDPFS> 
    <PTSD IO="false"> 
     <FBC>AP</FBC> 
     <ACD RBD="" ACCID="1" MCT="Super Sale Fare(AP)" INC="false" /> 
     <ATSID xsi:nil="true" /> 
    </PTSD> 
    </PTSDPFS> 
    <PTSDPFS> 
    <PTSD IO="false"> 
     <FBC>AP</FBC> 
     <ACD RBD="" ACCID="1" MCT="Super Sale Fare(AP)" INC="false" /> 
     <ATSID xsi:nil="true" /> 
    </PTSD> 
    </PTSDPFS> 
    <RuleDetails> 
    <TRS xsi:nil="true" /> 
    <PP xsi:nil="true" /> 
    <II xsi:nil="true" /> 
    <LTD xsi:nil="true" /> 
    </RuleDetails> 
</AirFareInfo> 

出力はAP、APでなければなりません。どのようにパフォーマンスを向上させるには?

+0

あなたのXMLは正しい形式ではなく、xml型で宣言できません。このヘッダー「ノード()メソッドのアプリケーションと効率」https://www.simple-talk.com/sql/database-administration/manipulating -xml-data-in-sql-server/ xml操作にはもう1つのことがありますが、それを思い出すことはできません。 – KumarHarsh

+0

* DBには100万件のレコードがあります。* XML内の値**を数百万で読むことはできません。しかし、あなたは 'Where [BookingID] = 123'を使用しています。この呼び出しをいくつかのレコードにフィルタリングしていますか? ''の数は修正されていますか(この場合は2つ)か '1:n'ですか?このノード内のコンテンツ*は修正されていますか、これはどこかで '1:n'ですか?これは一回限りの行動か、あなたが定期的にやるべきことですか?あなたはトリガーを使うかもしれません。検索したい値でサイドテーブルを維持します。 – Shnugo

+0

'AirTraveler.ID'はどこから来ますか? – Shnugo

答えて

0

私のコメントで言われたように、最良の答えは私が知らない多くの要因によって決まります。すべてtext()は(残念ながら1は、これを変更することはできません)空白で区切られた返しdata()

SELECT REPLACE(FareDetails.query(N'data(/AirFareInfo/PTSDPFS/PTSD/FBC)').value('(text())[1]','nvarchar(100)'),' ',',') 
FROM Table1 
WHERE BookingID=123 

XML方法:だけで簡単にショットとしてあなたはこれを試してみてください。 <FBC>内のテキストに空白が含まれていない限り、これは機能します。

+0

この答えは、AP、APの代わりにAP、AP –

+0

@PiyushSingでした。私は正しい結果を得た。たぶんこれはどこかで切り捨てられています(小さな変数、他の関数...) – Shnugo

+0

こんにちは@shnugo、私たちは重複した予約IDをテーブルに持っていれば失敗しています。BookingID 123はテーブルとFareDetails(xml) FBCは、4つのxmlに対応する値a、b、c、dを有する。 出力は、すべての4つのBookingIDに対してa、b、c、dでなければなりません。 現在、1番目のエントリの場合はb、2番目のエントリの場合はc、3番目のエントリの場合はc、4番目のエントリの場合はdです。手伝ってください。 –

関連する問題