XML-поиск данных, когда теги имеют одно и то же имя, с использованием сервера SQL

Для приведенного ниже XML:

<SheetData>
    <Finance>
        <value>1000</value>
        <Currency>USD</Currency>
        <Attribute>Sales</Attribute>
    </Finance>
    <Finance>
        <value>5000</value>
        <Currency>USD</Currency>
        <Attribute>Assets</Attribute>
    </Finance>
</SheetData>

Как я могу получить содержимое тега Value на основе записи в атрибуте с помощью запроса сервера Sql. Если атрибут является активом, значение должно быть 5000.

1 ответ

Попробуйте это так

DECLARE @xml XML=
N'<SheetData>
  <Finance>
    <value>1000</value>
    <Currency>USD</Currency>
    <Attribute>Sales</Attribute>
  </Finance>
  <Finance>
    <value>5000</value>
    <Currency>USD</Currency>
    <Attribute>Assets</Attribute>
  </Finance>
</SheetData>';

DECLARE @attr VARCHAR(100)='Assets';

SELECT @xml.value('(/SheetData/Finance[Attribute=sql:variable("@attr")]/value/text())[1]','int') 

Вы читаете XPath следующее:

Начать с SheetData и перейдите к Finance, Поиск узла, где <Attribute> как заданная переменная и читать valueтекст оттуда.

ОБНОВИТЬ

Ваш второй пример (в комментарии) добавляет еще один уровень вложенности Component:

declare @xml xml=
'<SheetData>
  <Finance>
    <value>1000</value>
    <GeoCurr>
      <Currency>USD</Currency>
    </GeoCurr>
    <Component>
      <Attribute>Sales</Attribute>
    </Component>
  </Finance>
  <Finance>
    <value>5000</value>
    <GeoCurr>
      <Currency>USD</Currency>
    </GeoCurr>
    <Component>
      <Attribute>Assets</Attribute>
    </Component>
  </Finance>
</SheetData>';

DECLARE @attr VARCHAR(100)='Assets';

SELECT @xml.value('(/SheetData/Finance[Component/Attribute=sql:variable("@attr")]/value/text())[1]','int')
Другие вопросы по тегам