- XQuery срещу типа данни xml
- Общи случаи на използване на XQuery
- XQueries, включващи йерархия
-
Всичко в блога на Майкъл Рис
Актуализация
Моята препоръка би била да раздробявате XML на релации и да правите търсения и съединявания на получената релация, по ориентиран към набори начин, а не по процедурния начин на търсене на конкретни възли в XML. Ето една проста XML заявка, която разкъсва възлите и атрибутите, представляващи интерес:
select x.value(N'../../../../@stepId', N'int') as StepID
, x.value(N'../../@id', N'int') as ComponentID
, x.value(N'@nom',N'nvarchar(100)') as Nom
, x.value(N'@valeur', N'nvarchar(100)') as Valeur
from @x.nodes(N'/xml/box/components/component/variables/variable') t(x)
Ако обаче трябва да използвате XPath, който извлича точно интересуващата ви стойност:
select x.value(N'@valeur', N'nvarchar(100)') as Valeur
from @x.nodes(N'/xml/box[@stepId=sql:variable("@stepID")]/
components/component[@id = sql:variable("@componentID")]/
variables/variable[@nom="Enabled"]') t(x)
Ако stepID и ID на компонента са колони, а не променливи, трябва да използвате sql:column() вместо sql:variable във филтрите на XPath. Вижте Обвързване на релационни данни в XML данни .
И накрая, ако всичко, от което се нуждаете, е да проверите за съществуване, можете да използвате exist( ) XML метод:
select @x.exist(
N'/xml/box[@stepId=sql:variable("@stepID")]/
components/component[@id = sql:variable("@componentID")]/
variables/variable[@nom="Enabled" and @valeur="Yes"]')