2009-07-31 7 views
9

J'ai une table qui contient un champ XML. Le XML typique qu'il contient est;Utilisation du type de données XML SQL Server

<things> 
    <Fruit> 
    <imageId>39</imageId> 
    <title>Apple</title> 
    </Fruit> 
    <Fruit> 
    <imageId>55</imageId> 
    <title>Pear</title> 
    </Fruit> 
    <Fruit> 
    <imageId>76</imageId> 
    <title>Grape</title> 
    </Fruit> 
</things> 

Dans ma table j'ai environ 50 lignes, je suis seulement préoccupé par deux champs, Omid (clé primaire int) et omText (mes données xml).

Ce que je suis en train de réaliser est une façon de dire, à travers toutes les données XML dans toute la table ... me donner tous les xmlElements où le titre est X. Ou me donner un compte de J'utilise les types de données XML VALUE et QUERY pour extraire les données.

select omID, 
    omText.query('/things/Fruit') 
    ,cast('<results>' + cast(omText.query('/things/Fruit') as varchar(max)) + '</results>' as xml) as Value 
    from dbo.myTable 
    where omText.value('(/things/Fruit/imageId)[1]', 'int') = 76 

Ce qui fonctionne uniquement lorsque l'ID que je recherche est le premier dans le document. Il ne semble pas chercher tout le xml. Fondamentalement, le résultat revient avec une ligne pour chaque entrée de la TABLE, alors que je pense avoir besoin d'une ligne pour chaque ELEMENT correspondant ... Je ne sais pas trop comment commencer à écrire un groupe pour cela.

Je commence à me sentir comme si je rendais cela plus difficile que nécessaire ...... pensées & idées s'il vous plaît.

Répondre

16

Ce que je suis en train de réaliser est une façon de dire, à travers toutes les données XML dans toute la table ... donnez-moi tous les xmlElements où le titre est X.

Je ne sais pas si j'ai entièrement compris votre question ici - ou recherchez-vous ceci? Vous saisir toutes les/choses/éléments de fruits un « nœuds » et croix les rejoindre contre votre « données de base » dans le myTable - le résultat serait une ligne par élément XML dans votre champ de données XML:

select 
    omID, 
    T.Fruit.query('.') 
from 
    dbo.myTable 
cross apply 
    omText.nodes('/things/Fruit') as T(Fruit) 
where 
    T.Fruit.value('(title)[1]', 'varchar(50)') = 'X' 

Ou donnez-moi un compte de tous les éléments qui utilisent un imageId de 55.

select 
    count(*) 
from 
    dbo.myTable 
cross apply 
    omText.nodes('/things/Fruit') as T(Fruit) 
where 
    T.Fruit.value('(imageId)[1]', 'int') = 55 

Est-ce que vous cherchez?

Marc

+1

C'est ..... Vous êtes une star. Bravo :) Ne supposez pas que vous pouvez me diriger vers des ressources décentes pour lire sur la manipulation SQL XML ??? – GordonB

+2

Content de pouvoir aider, Gordon! Le meilleur article XML XML DML que j'ai trouvé jusqu'à présent est assez ancien, mais toujours très utile: http://www.15seconds.com/Issue/050803.htm –

+0

Ou ici ceci peut-être: http://www.sqlservercentral.com/ Articles/SQL + Server + 2005/XML / –

Questions connexes