2008-09-09 137 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'