2009-07-31 25 views
9

Ho una tabella che ha un campo XML. L'XML tipico che contiene è;Lavorare con lo SQL Server tipo di dati XML

<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> 

Nel mio tavolo ho circa 50 righe, sono preoccupato solo con due campi, Omid (chiave primaria int) e omText (i miei dati XML).

quello che sto cercando di realizzare è un modo di dire, in tutti i dati XML in tutto il tavolo ... dammi tutti i xmlElements dove il titolo è X. o darmi un conteggio di tutti gli elementi che utilizzano un ImageID di 55.

sto usando il tipo di valore di dati XML e le funzioni di query per recuperare i dati.

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 

Che funziona solo dove l'ID che sto cercando è il primo nel documento. Non sembra cercare tutto l'xml.

Fondamentalmente il set di risultati ritorna con una riga per ogni voce nella TABELLA, dove penso che ho bisogno di avere una riga per ogni elemento abbinato ... Non esattamente sicuro come iniziare a scrivere un gruppo per questo.

Sto iniziando a sentire come sto rendendo questo più difficile di quanto debba essere ...... pensieri & idee per favore.

risposta

16

quello che sto cercando di realizzare è un modo di dire, in tutti i dati XML in tutto il tavolo ... dammi tutti i xmlElements dove il titolo è X.

Non sono sicuro se ho del tutto capito la tua domanda qui - o siete alla ricerca per questo? Si potrebbe prendere tutte le/cose/elementi di frutta a "nodi" e la croce unirsi a loro contro la vostra "data base" nel myTable - il risultato sarebbe una riga per ogni elemento XML nel tuo campo di dati 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' 

o darmi un conteggio di tutti gli elementi che utilizzano un ImageID di 55.

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

è quello che stai cercando?

Marc

+1

È ..... Sei una stella. Saluti :) Non supponiamo che tu possa indicarmi la direzione di qualsiasi risorsa decente per leggere sulla manipolazione SQL XML ??? – GordonB

+2

Felice di poter aiutare, Gordon! Il miglior articolo SQL DML XML che ho trovato finora è piuttosto vecchio, ma ancora molto utile: http://www.15seconds.com/Issue/050803.htm –

+0

O questo qui forse: http://www.sqlservercentral.com/ articoli/SQL + Server + 2005/XML / –

Problemi correlati