Разбор SQL XML для конкретного узла и его тегов - PullRequest
0 голосов
/ 26 июня 2018

Я использую следующее для получения конкретного XML:

DECLARE @queryID INT = 1 

/* get xml with queryID */
DECLARE @xml XML
SET @xml = (SELECT TOP 1 myPlan FROM myTable 
                WHERE stmtID in (@queryID))

XML, который он возвращает, выглядит примерно так:

<xmlPlan>
<myOp id='0' usage='0.75'>
    ....
    <myOp id='2' usage='0.45'>
        ...
    </myOp>
    <myOp id ='3' usage='0.30'>
        ...
    </myOp>
</myOp>
<myOp id='1' usage='0.35'>
    ...
</myOp>

Мне нужно проанализировать этот XML для узлов myOp и посмотреть, больше ли их тег использования .50. Это всегда должны быть конечные узлы, но их вложенные уровни могут изменяться.

Любая помощь будет великолепна. Спасибо.

1 Ответ

0 голосов
/ 27 июня 2018

Вы можете использовать что-то вроде этого (я добавил несколько узлов вокруг ваших узлов):

DECLARE @xml XML=
N'<xmlPlan>
<myOp id="0" usage="0.75">
    <OuterNode SomeAttr="outer1">
    <myOp id="2" usage="0.45">
        <someInnerNode SomeAttr="inner1"/>
    </myOp>
    <myOp id ="3" usage="0.30">
        <anotherInnerNode SomeAttr="inner2"/>
    </myOp>
    </OuterNode>
</myOp>
<myOp id="1" usage="0.35">
    <InnerNode SomeAttr="inner3" />
</myOp>
</xmlPlan>';

- запрос

SELECT A.n.value('local-name(..)','nvarchar(max)') AS ParentName
      ,A.n.value('../@SomeAttr','nvarchar(max)') AS ParentAttr
      ,A.n.value('local-name(.)','nvarchar(max)') AS NodeName
      ,A.n.value('@id','nvarchar(max)') AS LocalID
      ,A.n.value('@usage','nvarchar(max)') AS LocalType
FROM @xml.nodes('/xmlPlan//myOp[@usage > 0.4]') A(n);

Запрос будет использовать глубокий поиск (//) ниже /xmlPlan, чтобы найти любой <myOp>, где бы он ни находился. Предикат [@usage > 0.4] выберет только те, у которых атрибут usage превышает 0,4 (в данном случае две строки).

Остальное - метаинформация, которая вам может понадобиться - или нет ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...