Вот моя проблема: из следующего 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>'
3 ответа
- 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 и идентификатор компонента являются столбцами, а не переменными, вы должны использовать sql: column () вместо sql: variable в фильтрах XPath. См. Связывание реляционных данных внутри данных XML.
И, наконец, если все, что вам нужно, это проверить наличие, вы можете использовать exist () < / a> XML-метод:
select @x.exist(
N'/xml/box[@stepId=sql:variable("@stepID")]/
components/component[@id = sql:variable("@componentID")]/
variables/variable[@nom="Enabled" and @valeur="Yes"]')
Я думаю, что запрос xpath, который вам нужен, выглядит примерно так:
/xml/box[@stepId="$stepId"]/components/component[@id="$componentId"]/variables/variable[@nom="Enabled" and @valeur="Yes"]
Это должно дать вам переменные с именем «Включено» со значением «Да» для указанных $ stepId и $ componentId. Предполагается, что ваш xml начинается с тега, который вы показываете, а не с
Если материал XPath в SQL Server 2005 довольно прост (я никогда его не использовал), то приведенный выше запрос должен работать. В противном случае кто-то другой может вам в этом помочь.
Я всегда возвращаюсь к этой статье SQL Server 2005 XQuery и XML-DML - Часть 1, чтобы узнать, как использовать функции XML в SQL Server 2005.
Для получения базовых знаний о XPath я бы порекомендовал учебник W3Schools.
Похожие вопросы
Связанные вопросы
Новые вопросы
sql-server
Microsoft SQL Server - это система управления реляционными базами данных (RDBMS). Используйте этот тег для всех выпусков SQL Server, включая Compact, Express, Azure, Fast-track, APS (ранее PDW) и Azure SQL DW. Не используйте этот тег для других типов СУБД (MySQL, PostgreSQL, Oracle и т. Д.). Не используйте этот тег для проблем, связанных с разработкой программного обеспечения и мобильных устройств, если только он не связан напрямую с базой данных.
@x
? (дополнение комментария до 15 символов)DECLARE @x XML = (xml from question);
над своими операторами в окне запроса SQL Server, чтобы протестировать этот XML, но удалил его из своего ответа, потому что он был бы избыточным. Все это, чтобы сказать, я подозреваю, что это переменная, содержащая XML из вопроса.