SQL Server:XML 获取节点中存在值的节点

问题描述 投票:0回答:2

我从数据库中选择下面的 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>
sql sql-server xml
2个回答
2
投票

正如另一个答案中所述,对于空命名空间,您不应该放置

:
,只需将其保留即可。

在需要在查询中的多个位置查询同一节点的情况下,性能更高的版本是使用

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

db<>小提琴


1
投票

您的 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

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.