Вы можете использовать что-то вроде этого (я добавил несколько узлов вокруг ваших узлов):
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 (в данном случае две строки).
Остальное - метаинформация, которая вам может понадобиться - или нет ...