我需要使用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。 感谢帮助。
答案 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);