我公司的“联系人”表格中有一个字段。在该表中,有一个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列的更好方法吗?
答案 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'