Нужна помощь в написании sql xquery

Мне нужно выбрать конкретные значения из XML в SQL, используя xquery. Ниже приведен XML

DECLARE @v_productss_xml XML

set @v_productss_xml = 

'<Products EventTemplateId="1">
  <Product ProductId="BD0A7272-5D6D-47DA-9781-1BE4ACAC2D34" ProductName="Income Tax5">
    <Field FieldId="1" Fieldname="f1" />
    <Field FieldId="" Fieldname="f5" />
    <Field FieldId="" Fieldname="f6" />
  </Product>
  <Product ProductId="2EEB192E-1E95-4E6F-8A05-248DFC3A37EE" ProductName="Income Tax6">
    <Field FieldId="4" Fieldname="e1" />
    <Field FieldId="" Fieldname="e4" />
  </Product>
</Products>'

Я хочу ProductId, имя поля для строк, когда FieldId="". Для XML выше, это было бы

BD0A7272-5D6D-47DA-9781-1BE4ACAC2D34, f5
BD0A7272-5D6D-47DA-9781-1BE4ACAC2D34, f6
2EEB192E-1E95-4E6F-8A05-248DFC3A37EE, e4

Я могу сравнить атрибут fieldid, но могу выбрать идентификатор продукта. Помощь приветствуется.

1 ответ

Решение

Я полагаю, что вы после этого

SELECT
    Nodes.node.value('@ProductId', 'varchar(50)') AS ProductId,
    Nodes.node.value('(Field[@FieldId=""]/@Fieldname)[1]', 'varchar(50)') AS Field
FROM
    @v_productss_xml.nodes('//Product') AS Nodes(node);

В основном, найти //Product узлы в документе XML, затем для каждой строки оцените @ProductId атрибут, а затем, на поле, которое имеет пустой FieldId атрибут, оценить @Fieldname приписывать.

Re: обновленное требование / новый Xml

Ваш заданный запрос возвращает только первую дочернюю запись, мне нужны все дочерние записи с пустым значением. Спасибо за помощь

Если есть более одного ребенка, я бы сменил тему на Field, сделайте фильтрацию на empty атрибут, а затем перейдите к родителю, чтобы получить ProductId, Вот так:

SELECT
    Nodes.node.value('parent::Product/@ProductId', 'varchar(50)') AS ProductId,
    Nodes.node.value('@Fieldname', 'varchar(50)') AS attrib
FROM
    @v_productss_xml.nodes('//Product/Field[@FieldId=""]') AS Nodes(node);
Другие вопросы по тегам