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')