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>'
23
задан Zanon 6 January 2017 в 16:14
поделиться

3 ответа

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"]') 
36
ответ дан 29 November 2019 в 02:04
поделиться

Я всегда возвращаюсь к этой статье SQL Server 2005 XQuery и XML-DML - Часть 1 , чтобы узнать, как использовать функции XML в SQL Server 2005.

Для базовых знаний XPath я бы порекомендовал учебник W3Schools .

2
ответ дан 29 November 2019 в 02:04
поделиться

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

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

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

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

2
ответ дан 29 November 2019 в 02:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: