2013-08-16 20 views
5

Mam problemy z przetwarzaniem danych XML przechowywanych w bazie danych SQL Server 2012. Drzewo węzeł pragnę zapytania jest w następującym formacie -Użycie zapytania SQL do wysłania zapytania do kolumny danych 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> 

Co chciałbym zrobić, to wrócić atrybut wartość węzeł elementu wybranego atrybutu jest równa true. Czytałem kilka samouczków na temat kwerendy XML w SQL, ale nie wydaje się, aby uzyskać prawidłowy kod.

Dzięki Stu

Odpowiedz

4

DEMO

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

Dziękuję, nie owijając w danych XPath() – StuartO

+1

jedna mała uwaga, będzie to rodzaj xml i nie varchar –

+0

zobaczyć 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'; 

nb

Właściwie wolę inne podejście opublikowane przez Marcina Juraszka, jednak poniższe korzyści mogą być korzystne, jeśli wymagane są dodatkowe dane do wyodrębnienia. Pierwotnie usunąłem odpowiedź, ale mogą zaistnieć sytuacje, w których takie podejście jest przydatne, więc w interesie pokazania wszystkich opcji, które usunąłem.

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

sql fiddle demo

Powiązane problemy