2008-09-09 12 views
3

Il existe un champ dans la table "Contacts" de ma société. Dans cette table, il y a une colonne de type XML. La colonne contient des données diverses sur un contact particulier. PAR EXEMPLE.Interrogation de colonnes XML dans SQLServer 2005

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

Les balises ci-dessous contact peuvent être différents pour chaque contact, et je dois interroger ces fragments à côté des colonnes de données relationnelles dans la même table.

J'ai utilisé des constructions comme:

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 

Cette méthode fonctionne bien, mais il faut un certain temps pour que le serveur réponde. J'ai également étudié en utilisant la fonction nodes() pour analyser les nœuds XML et exist() pour tester si un nœud contient la valeur que je recherche.

Est-ce que quelqu'un sait une meilleure façon de demander des colonnes XML ??

+0

Cela prend du temps, voulez-vous dire que le serveur met du temps à répondre, ou qu'il faut beaucoup d'efforts pour écrire la requête? – Espo

+0

Je veux dire que ça prend trop de temps pour que le serveur revienne avec des résultats – nialljsmith

Répondre

0

En plus de la page mentionnée par @pauljette, cette page a une bonne optimisation des performances conseil:

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

il y a beaucoup que vous pouvez faire pour accélérer les performances des requêtes XML, mais il ne sera jamais aussi bon que les données relationnelles correctement indexées. Si vous sélectionnez un document et que vous interrogez uniquement celui-ci, vous pouvez très bien le faire, mais lorsque votre requête doit analyser plusieurs documents similaires à la recherche de quelque chose, c'est comme une recherche de clé dans un plan de requête relationnel. c'est-à-dire lente).

+0

J'ai lu cet article lors d'une révision de code. J'ai suivi certains des conseils mais je suis très limité dans ce que je peux faire à la DB. J'ai seulement mis à jour notre serveur sql à 2005 il y a environ 6 mois. – nialljsmith

3

Si vous effectuez une écriture et beaucoup de lectures, effectuez l'opération d'analyse au moment de l'écriture et convertissez ces données dans un format plus interrogeable. Une première suggestion serait de les analyser dans une table connexe mais séparée, avec des colonnes name/value/contactID.

0

Si vous avez un XSD pour votre XML, vous pouvez l'importer dans votre base de données et vous pouvez ensuite créer des index pour vos données XML.

0

Essayez cette

SELECT * FROM conversionupdatelog OÙ convert (XML, colName) .value ('(/ prospects/plomb/@ LeadID =' '[email protected]' ') [1]', 'varchar (max)') = 'true'