2017-03-03 27 views
0

我陷入了一點轍。我有一個XML和SQl服務器。我想讓所有FBC的值用逗號分隔。由於性能問題,SQL Cross的替代應用

表的名字是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 ('') 

但是我在數據庫中有百萬條記錄,這對性能造成了巨大的損失。

的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 type.read this header「Nodes()方法應用程序和效率」https://www.simple-talk.com/sql/database-administration/manipulating -xml-data-in-sql-server/ 在xml操作中還有一件事情,但不能回想起來。 – KumarHarsh

+0

*但是我在DB中有百萬條記錄* ...在XML中爲數百萬讀取值**不能很快......但是您正在使用WHERE [BookingID] = 123'。您是否將此電話過濾到了幾條記錄? ''修復了(在這種情況下是兩個)還是'1:n'? *此節點中的內容*是否可以修改,或者可能是某處的'1:n'?這是一次性行動嗎?還是你必須做的事?您可以使用觸發器。維護一個你想要搜索的值的邊桌。 – Shnugo

+0

'AirTraveler.ID'從哪裏來? – Shnugo

回答

0

正如我的評論所說,最好的答案取決於許多我不知道的因素。就像一個快速射擊,你可以試試這個:data()返回

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

XML方法都發現text()分隔空白(遺憾我們不能改變這一點)。這個工作,只要你的文字<FBC>不包含空白它自己。

+0

這個答案是給出輸出:AP,A而不是AP,AP –

+0

@PiyushSing我試過了,我得到了正確的結果。也許這是削減某處(可變小,其他功能...) – Shnugo

+0

嗨@shnugo,當我們在表中有重複的bookingid,那麼它是失敗的.eg BookingID 123來了4次在表和FareDetails(xml) FBC的值a,b,c,d對應於4 xml。 對於所有4個BookingID,輸出應該是a,b,c,d。 當前輸出爲第一個輸入爲b,第二個輸入爲c,第三個輸入爲d,第四個輸入爲d。請協助。 –