Вот моя проблема: из следующего 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>'
24
joerage 12 Дек 2009 в 00:16

3 ответа

Лучший ответ

Обновить

Я бы порекомендовал разбить 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"]') 
37
Remus Rusanu 12 Дек 2009 в 01:05
4
Что такое @x? (дополнение комментария до 15 символов)
 – 
Ian Boyd
5 Фев 2013 в 20:39
3
Я подозреваю, что он поставил DECLARE @x XML = (xml from question); над своими операторами в окне запроса SQL Server, чтобы протестировать этот XML, но удалил его из своего ответа, потому что он был бы избыточным. Все это, чтобы сказать, я подозреваю, что это переменная, содержащая XML из вопроса.
 – 
sirdank
25 Фев 2014 в 18:53

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

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

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

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

2
Mike Cialowicz 12 Дек 2009 в 00:44
Спасибо, это помогло. Как я могу вернуть истину или ложь, если совпадение найдено или нет? Или верните 0 или 1.
 – 
joerage
12 Дек 2009 в 01:04
Я не уверен. Вы можете попробовать что-то вроде этого: IF count ()> = 1 SELECT 1 ELSE SELECT 0
 – 
Mike Cialowicz
14 Дек 2009 в 03:52
Вы можете использовать метод EXIST. Поле.EXIST ('xpath')
 – 
Robin Bennett
23 Сен 2013 в 18:48

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

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

2
marc_s 28 Авг 2018 в 15:12
1
Обе эти ссылки мертвы. Я предлагаю посмотреть справочник по языку по адресу: docs.microsoft.com/en-us/sql/xquery/…
 – 
Lachlan Ennis
28 Июн 2018 в 03:18
Ссылки мертвы.
 – 
user482745
28 Авг 2018 в 12:22
1
@ user482745: первая ссылка работала нормально - обновила вторую ссылку, снова работает
 – 
marc_s
28 Авг 2018 в 15:13