2015-04-16 3 views
1

Я пытаюсь проверить, соответствует ли XML-документ в sql определенным требованиям.Сравнение дочерних узлов с элементами в XQuery

CREATE TABLE #ValueExample 
(
XMLDocument xml 
) 

INSERT INTO #ValueExample 
VALUES ('<History> 
    <step start="2/22/2015 5:17:55 PM" end="" user="Intake Processor"> 
    <type id="1" value="2" /> 
    <type id="2" value="0" /> 
    <type id="3" value="0" /> 
    <type id="4" value="0" /> 
    </step> 
    <step start="2015-03-13 10:56:29.980" end="" user="BD Save Followup"> 
    <type id="0" value="5" /> 
    <type id="1" value="4" /> 
    <type id="2" value="3" /> 
    <type id="3" value="0" /> 
    <type id="4" value="0" /> 
    </step> 
    <step start="2015-02-22 20:08:58.053" end="" user="BD Save Followup"> 
    <type id="0" value="5" /> 
    <type id="1" value="4" /> 
    <type id="2" value="174" /> 
    <type id="3" value="181" /> 
    <type id="4" value="0" /> 
    </step> 
</History>') 

Мне нужно знать, если этот документ имеет ступенчатый узел, который имеет дочерние элементы типа со значениями атрибутов ID = 2 и значение = 174, также элемент типа с атрибутами типа ид = 3 и значение = 181.

В основном последний узел соответствует моим условиям. вот sql, который я пробовал, а также способ создания теста.

Sql Я пытаюсь

SELECT c.query('.') AS XMLFragment 
,c.value('(@id)[1]','int') AS value 
,c.query('..') as wholexml 
,c.value('(@id)[1]','int') as id 
,c.value('(@value)[1]','int') as value 
,c.query('(//step/type)[1]') as typeelements 
FROM #ValueExample 
CROSS APPLY XMLDocument.nodes('//step/type') as t(c) 

проблему мне нужно один последний typeelements, сгруппированных по шагам ...

Я надеюсь, что это было достаточно ясно понять. Если вам нужно дополнительное осветление, просто спросите.

ответ

0

вы можете использовать SQLXML exist() метод

select 
    t.c.query('.') AS XMLFragment 
from #ValueExample as v 
    cross apply v.XMLDocument.nodes('//step') as t(c) 
where 
    t.c.exist('type[@id=2 and @value=174]') = 1 and 
    t.c.exist('type[@id=3 and @value=181]') = 1 

sql fiddle demo

Смежные вопросы