我从数据库中选择下面的 XML。
在此 XML 中,我想选择节点内存在特定值的节点。
例如:在 XML 中,我搜索节点
ArtNr = 209232
的节点。如果该值存在,则查询必须返回节点 <ArtDesc>
内的值和节点 <QTY>
内的值(此处:CP 01 Fans
和 1.0000000000
)。
为了检查
ArtNr
是否存在,我在 WHERE
子句中使用以下命令
info_TOL_ArticleList.exist('(/*:LIST/*:ELEMENTS/*:TOL_Article/*:fields/*:ArtNr[.="209232"])') = 1
这是我正在使用的 XML:
<LIST>
<ELEMENTS>
<TOL_Article>
<fields>
<ArtDesc>Looprooster L1100xW1100x2mm Mesh 33,33x33,33</ArtDesc>
<ArtNr>515021111</ArtNr>
<BasePrice>153.7500</BasePrice>
<Qty>3.0000000000</Qty>
<Sort />
<Unit>st</Unit>
</fields>
</TOL_Article>
<TOL_Article>
<fields>
<ArtDesc>FP Box</ArtDesc>
<ArtNr>595224</ArtNr>
<BasePrice>100.0000</BasePrice>
<Qty>5.0000000000</Qty>
<Sort />
<Unit>st</Unit>
</fields>
</TOL_Article>
<TOL_Article>
<fields>
<ArtDesc>Cable assembly Fused</ArtDesc>
<ArtNr>595225</ArtNr>
<BasePrice>110.0000</BasePrice>
<Qty>5.0000000000</Qty>
<Sort />
<Unit>st</Unit>
</fields>
</TOL_Article>
<TOL_Article>
<fields>
<ArtDesc>CP 01 Fans</ArtDesc>
<ArtNr>209232</ArtNr>
<BasePrice>4300.0000</BasePrice>
<Qty>1.0000000000</Qty>
<Sort />
<Unit>st</Unit>
</fields>
</TOL_Article>
</ELEMENTS>
</LIST>
正如另一个答案中所述,对于空命名空间,您不应该放置
:
,只需将其保留即可。
在需要在查询中的多个位置查询同一节点的情况下,性能更高的版本是使用
.nodes
表值函数
您还应该使用
/text()
而不是依赖于 .value
中的隐式原子化。
SELECT
article.value('(ArtDesc/text())[1]', 'NVARCHAR(255)') AS ArtDesc,
article.value('(Qty/text())[1]', 'DECIMAL(18,10)') AS Qty
FROM
XML_DATA xd
CROSS APPLY xd.info_TOL_ArticleList.nodes('
/LIST/ELEMENTS/TOL_Article/fields [(ArtNr/text()) = "209232"]
') x1(article);
您的 xml 没有任何命名空间,因此在未定义命名空间的情况下在 xpath 中使用
:
将导致错误。
更正确的是:
info_TOL_ArticleList.exist('/LIST/ELEMENTS/TOL_Article[fields/ArtNr="209232"]') = 1
SELECT
info_TOL_ArticleList.value('(/LIST/ELEMENTS/TOL_Article[fields/ArtNr="209232"]/fields/ArtDesc)[1]', 'NVARCHAR(255)') AS ArtDesc,
info_TOL_ArticleList.value('(/LIST/ELEMENTS/TOL_Article[fields/ArtNr="209232"]/fields/Qty)[1]', 'DECIMAL(18,10)') AS Qty
FROM
XML_DATA
WHERE
info_TOL_ArticleList.exist('/LIST/ELEMENTS/TOL_Article[fields/ArtNr="209232"]') = 1;
输出:
艺术描述 | 数量 |
---|---|
CP 01 粉丝 | 1.0000000000 |