Question

There is a field in my company's "Contacts" table. In that table, there is an XML type column. The column holds misc data about a particular contact. EG.

<contact>
<refno>123456</refno>
<special>a piece of custom data</special>
</contact>

The tags below contact can be different for each contact, and I must query these fragments alongside the relational data columns in the same table.

I have used constructions like:

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

This method works ok but, it takes a while for the Server to respond. I have also investigated using the nodes() function to parse the XML nodes and exist() to test if a nodes holds the value I'm searching for.

Does anyone know a better way to query XML columns??

Was it helpful?

Solution

I've found the msdn xml best practices helpful for working with xml blob columns, might provide some inspiration... http://msdn.microsoft.com/en-us/library/ms345115.aspx#sql25xmlbp_topic4

OTHER TIPS

If you are doing one write and a lot of reads, take the parsing hit at write time, and get that data into some format that is more query-able. A first suggestion would be to parse them into a related but separate table, with name/value/contactID columns.

In addition to the page mentioned by @pauljette, this page has good performance optimization advice:

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

There's a lot you can do to speed up the performance of XML queries, but it will never be as good as properly indexed relational data. If you are selecting one document and then querying inside just that one, you can do pretty well, but when your query needs to scan through a bunch of similar documents looking for something, it's sort of like a key lookup in a relational query plan (that is, slow).

If you have a XSD for your Xml then you can import that into your database and you can then build indexes for your Xml data.

Try this

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

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top