2013-08-16 14 views
5

Si verificano problemi durante l'interrogazione di dati XML archiviati in un database di SQL Server 2012. L'albero dei nodi desidero query è il seguente formato -Utilizzo di SQL per eseguire query su una colonna di dati XML

<eForm> 
    <page id="equalities" visited="true" complete="true"> 
     <Belief> 
     <item selected="True" value="Christian">Christian</item> 
     <item selected="False" value="Jewish">Jewish</item> 
     ... 
     </Belief> 
    </page> 
</eForm> 

Quello che vorrei fare è restituire l'attributo valore del nodo elemento in cui l'attributo selezionato è uguale a true. Ho letto diversi tutorial su query XML in SQL, ma non riesco a ottenere il codice giusto.

Grazie Stu

risposta

4

DEMO

SELECT [value].query('data(eForm/page/Belief/item[@selected="True"]/@value)') 
FROM test 
+0

Grazie, non mi stava avvolgendo il XPath nei dati() – StuartO

+1

una piccola nota, questo sarebbe di tipo xml e non varchar –

+0

vedere http://sqlfiddle.com/#! 6/ddaf2/2 –

0
DECLARE @T TABLE (X XML); 
INSERT @T VALUES ('<eForm> 
         <page id="equalities" visited="true" complete="true"> 
          <Belief> 
          <item selected="True" value="Christian">Christian</item> 
          <item selected="False" value="Jewish">Jewish</item> 
          </Belief> 
         </page> 
        </eForm>') 

SELECT item.value('item[1]', 'NVARCHAR(50)')  
FROM @T 
     CROSS APPLY X.nodes('eForm/page/Belief') i (item) 
WHERE item.value('(item[1]/@selected)[1]', 'VARCHAR(5)') = 'true'; 

N.B.

In realtà preferisco l'altro approccio pubblicato da MarcinJuraszek, tuttavia potrebbero esserci dei vantaggi nel caso in cui siano necessari ulteriori dati da estrarre. Inizialmente ho cancellato la risposta, ma potrebbero esserci situazioni in cui questo approccio è utile quindi nell'interesse di mostrare tutte le opzioni che ho eliminato.

1
select 
    Value.value('(eForm/page/Belief/item[@selected="True"])[1]/@value', 'nvarchar(max)')  
from test 

sql fiddle demo

Problemi correlati