XPath для получения значения SQL XML
Вот моя проблема: из следующего XML, который находится внутри столбца, я хочу знать, соответствует ли значение переменной с именем "Включено" "Да" с идентификатором шага и идентификатором компонента.
'<xml>
<box stepId="1">
<components>
<component id="2">
<variables>
<variable id="3" nom="Server" valeur="DEV1" />
<variable id="4" nom="Enabled" valeur="Yes" />
</variables>
</component>
<component id="3">
<variables>
<variable id="3" nom="Server" valeur="DEV1" />
<variable id="4" nom="Enabled" valeur="No" />
</variables>
</component>
</components>
</box>
<box stepId="2">
<components>
<component id="2">
<variables>
<variable id="3" nom="Server" valeur="DEV2" />
<variable id="4" nom="Enabled" valeur="Yes" />
</variables>
</component>
<component id="3">
<variables>
<variable id="3" nom="Server" valeur="DEV2" />
<variable id="4" nom="Enabled" valeur="No" />
</variables>
</component>
</components>
</box>
</xml>'
Ответы
Ответ 1
Обновление
Моя рекомендация заключалась бы в том, чтобы портить 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 и идентификатором компонента являются столбцы, а не переменные, вы должны использовать sql: column() вместо переменной sql: в фильтрах 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"]')
Ответ 2
Я всегда возвращаюсь к этой статье SQL Server 2005 XQuery и XML-DML - часть 1, чтобы узнать, как использовать функции XML в SQL Server 2005.
Для базового ноу-хау XPath я бы рекомендовал учебник W3Schools.
Ответ 3
Я думаю, что запрос xpath, который вы хотите, выглядит примерно так:
/xml/box[@stepId="$stepId"]/components/component[@id="$componentId"]/variables/variable[@nom="Enabled" and @valeur="Yes"]
Это даст вам переменные с именем "Включено" со значением "Да" для указанных $stepId и $componentId. Предполагается, что ваш xml начинается с тега, который вы показываете, а не
Если материал SQL Server 2005 XPath довольно прост (я его никогда не использовал), то этот запрос должен работать. В противном случае вам может помочь кто-то другой.