我公司的“联系人”表中有一个字段。在该表中,有一个 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 节点并使用exist() 来测试节点是否包含我正在搜索的值。

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

有帮助吗?

解决方案

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

其他提示

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

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

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

您可以采取很多措施来加快 XML 查询的性能,但它永远不会像正确索引的关系数据那样好。如果您选择一个文档,然后在该文档中进行查询,您可以做得很好,但是当您的查询需要扫描一堆相似的文档来查找某些内容时,它有点像关系查询计划中的键查找(那是, 慢的).

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

尝试这个

从conversionUpDateLog中进行选择,其中convert(xml,colname).value('('(/leads/leads/@leadiD =''xyz@airproducts.com'')[1]')[1]','varchar(max)='true')='true'

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top