在编写sql xquery时需要帮助

时间:2015-01-08 11:02:46

标签: sql-server xml xquery-sql

我需要使用xquery从sql中选择xml中的特定值。下面给出的是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>'

当FieldId =“”时,我想要行的FieldId,Fieldname。对于上面的xml将是

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

我能够比较fieldid属性但能够选择产品ID。 感谢帮助。

1 个答案:

答案 0 :(得分: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);

基本上,在xml文档中找到//Product个节点,然后,对于每一行,评估@ProductId属性,然后在具有空FieldId属性的字段上,评估@Fieldname属性。

Re:更新了需求/新Xml

  

您提供的查询仅返回第一个子记录,我需要所有具有空值的子记录。谢谢你的帮助

如果有多个子节点,那么我会将主题更改为Field,立即对empty属性进行过滤,然后导航回父节点以获取ProductId 1}}。像这样:

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