在SQLServer 2005中查询XML列

时间:2008-09-09 14:57:02

标签: sql-server xml xquery

我公司的“联系人”表格中有一个字段。在该表中,有一个XML类型列。该列包含有关特定联系人的misc数据。例如。

<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节点,并使用exists()来测试节点是否包含我正在搜索的值。

有谁知道查询XML列的更好方法吗?

5 个答案:

答案 0 :(得分:3)

如果您正在进行一次写入和大量读取,请在写入时进行解析命中,并将该数据转换为更具查询性的格式。第一个建议是将它们解析为一个相关但独立的表,名称/值/ contactID列。

答案 1 :(得分:1)

我发现有助于使用xml blob列的msdn xml最佳实践,可能会提供一些灵感...... http://msdn.microsoft.com/en-us/library/ms345115.aspx#sql25xmlbp_topic4

答案 2 :(得分:0)

除了@pauljette提到的页面之外,这个页面还有很好的性能优化建议:

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

您可以做很多事情来加快XML查询的性能,但它永远不会像正确索引的关系数据那样好。如果你选择一个文档,然后在那个文档中查询,你可以做得很好,但是当你的查询需要扫描一堆类似的文档寻找某些东西时,它有点像关系查询计划中的键查找(也就是说,)。

答案 3 :(得分:0)

如果您的Xml有XSD,那么您可以将其导入数据库,然后可以为您的Xml数据构建索引。

答案 4 :(得分:0)

试试这个

SELECT * FROM conversionupdatelog WHERE convert(XML,colName).value('(/ leads / lead / @ LeadID =''xyz@airproducts.com'')[1]','varchar(max)')='true'