2008-09-09 132 views
3

我公司的「聯繫人」表中有一個字段。在該表中,有一個XML類型的列。該列包含有關特定聯繫人的混雜數據。例如。查詢SQLServer 2005中的XML列

<contact> 
<refno>123456</refno> 
<special>a piece of custom data</special> 
</contact> 

下面contact該標籤可以是爲每個聯繫人不同,我必須查詢這些片段 在同一表中的關係數據列並排。

我曾經用過類似的結構:

SELECT c.id AS ContactID,c.ContactName as ForeName, 
c.xmlvaluesn.value('(contact/Ref)[1]', 'VARCHAR(40)') as ref,  
INNER JOIN ParticipantContactMap pcm ON c.id=pcm.contactid 
AND pcm.participantid=2140 
WHERE xmlvaluesn.exist('/contact[Ref = "118985"]') = 1 

此方法效果好,不過,它需要一段時間的服務器響應。 我也調查過使用nodes()函數解析XML節點,並存在()來測試節點是否保存我正在搜索的值。

有誰知道更好的方式來查詢XML列?

+0

耗時,你的意思是服務器需要很長時間才能做出響應,或者需要花費很多精力來編寫查詢? – Espo 2008-09-09 14:59:53

+0

我的意思是t需要很長時間才能讓服務器返回結果 – nialljsmith 2008-09-12 16:01:20

回答

0

除了由@pauljette提到的頁面,此頁面具有良好的性能優化建議:

http://msdn.microsoft.com/en-us/library/ms345118.aspx

有很多可以做,以加快XML查詢的性能,但它永遠不會是好,因爲適當的索引關係數據。如果您選擇了一個文檔,然後查詢其中的內容,那麼您可以做得很好,但是當您的查詢需要掃描大量類似的文檔以查找某些內容時,這有點像關係查詢計劃中的關鍵查找(即,)。

3

如果您正在進行一次寫入和大量讀取,請在寫入時執行解析命中,並將該數據轉換爲更具查詢能力的格式。第一個建議是將它們解析爲一個相關但是獨立的表格,其中包含名稱/值/ contactID列。

0

如果你有一個用於Xml的XSD,那麼你可以將它導入到你的數據庫中,然後你可以爲你的Xml數據建立索引。

0

嘗試此

SELECT * FROM conversionupdatelog WHERE 轉換(XML,COLNAME)。價值( '(/引線/鉛/ @ LeadID =' '[email protected]' ')[1]', 'varchar(max)')='true'