You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从数据库XML中根据ArtNr节点值查询对应ArtDesc和Qty值?

从XML数据中筛选特定节点并提取对应字段值

需求:从数据库获取的XML数据中,筛选出<ArtNr>节点值为209232的<TOL_Article>节点,并返回对应的<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>

解决方案

方法1:使用nodes()拆分节点(支持多匹配场景)

如果XML中可能存在多个符合条件的<TOL_Article>节点,这种方式可返回所有匹配记录:

SELECT
    Article.value('(fields/ArtDesc)[1]', 'nvarchar(max)') AS ArtDesc,
    Article.value('(fields/Qty)[1]', 'decimal(18,10)') AS Qty
FROM
    YourTable
CROSS APPLY
    info_TOL_ArticleList.nodes('/*:LIST/*:ELEMENTS/*:TOL_Article[fields/ArtNr = "209232"]') AS T(Article)

方法2:直接用value()提取(单匹配场景)

若确定XML中只有一个符合条件的节点,可直接在SELECT中定位提取:

SELECT
    info_TOL_ArticleList.value('(/*:LIST/*:ELEMENTS/*:TOL_Article[fields/ArtNr = "209232"]/fields/ArtDesc)[1]', 'nvarchar(max)') AS ArtDesc,
    info_TOL_ArticleList.value('(/*:LIST/*:ELEMENTS/*:TOL_Article[fields/ArtNr = "209232"]/fields/Qty)[1]', 'decimal(18,10)') AS Qty
FROM
    YourTable
WHERE
    info_TOL_ArticleList.exist('/*:LIST/*:ELEMENTS/*:TOL_Article/fields/ArtNr[. = "209232"]') = 1

两种方法都能精准筛选目标节点并提取所需字段,方法1扩展性更强,适合多匹配场景。

内容的提问来源于stack exchange,提问作者arjan kroon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 02:57:07