3

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

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

4

5 回答 5

3

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

于 2008-09-09T17:52:44.540 回答
1

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

于 2008-09-09T15:02:32.750 回答
0

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

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

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

于 2008-09-09T15:26:17.373 回答
0

如果你的 Xml 有一个 XSD,那么你可以将它导入到你的数据库中,然后你可以为你的 Xml 数据建立索引。

于 2008-09-13T07:12:53.890 回答
0

试试这个

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

于 2014-01-30T10:24:31.103 回答