Нужна помощь в написании 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);