Подтвердить что ты не робот

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>'
4b9b3361

Ответ 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"]') 

Ответ 3

Я думаю, что запрос xpath, который вы хотите, выглядит примерно так:

/xml/box[@stepId="$stepId"]/components/component[@id="$componentId"]/variables/variable[@nom="Enabled" and @valeur="Yes"]

Это даст вам переменные с именем "Включено" со значением "Да" для указанных $stepId и $componentId. Предполагается, что ваш xml начинается с тега, который вы показываете, а не

Если материал SQL Server 2005 XPath довольно прост (я его никогда не использовал), то этот запрос должен работать. В противном случае вам может помочь кто-то другой.