Вот моя проблема: от следующего 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>'
Anything in Michael Rys blog
Update
My recomendation would be shrack the XML into relations and do search search and joinins on the result relationship, в заданной ориентации, а не в процедурном способе поиска конкретных узлов в 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)
Если идентификатор шага и идентификатор компонента являются столбцами, а не переменными, то вы должны использовать sql:column() вместо sql:variable в XPath-фильтрах. Смотрите Binding Relational Data Inside XML Data.
And finaly if all you need to check for existance you can use exist() XML method:
select @x.exist(
N'/xml/box[@stepId=sql:variable("@stepID")]/
components/component[@id = sql:variable("@componentID")]/
variables/variable[@nom="Enabled" and @valeur="Yes"]')
Я всегда возвращаюсь к этой статье SQL Server 2005 XQuery и XML-DML - Часть 1 , чтобы узнать, как использовать функции XML в SQL Server 2005.
Для базовых знаний XPath я бы порекомендовал учебник W3Schools .
Я думаю, что запрос xpath, который вы хотите, выглядит примерно так:
/xml/box[@stepId="$stepId"]/components/component[@id="$componentId"]/variables/variable[@nom="Enabled" and @valeur="Yes"]
Это должно дать вам переменные с именем «Включено» со значением «Да» для указанного $ stepId и $ componentId. Предполагается, что ваш xml начинается с тега, который вы показываете, а не
. Если материал XPath в SQL Server 2005 довольно прост (я никогда его не использовал), то приведенный выше запрос должен работать. В противном случае кто-то другой может вам в этом помочь.