2015-01-08 4 views
1

Мне нужно выбрать определенные значения из xml в sql с помощью xquery. Ниже приводится xmlНужна помощь в написании sql xquery

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); 
+0

[SqlFiddle здесь, если вам это нужно] (http://sqlfiddle.com/#!3/d41d8/42180) – StuartLC

+0

Привет, данный запрос Вами возвращается только первая запись ребенка, Мне нужны все дочерние записи с пустым значением. Спасибо за помощь. – Narayana

+0

@ Нараяна. Я обновил. – StuartLC