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

SQL Server解析XML如何获取父节点ROW的NU_LINE字段值

问题原因

你当前代码的OPENXML查询上下文定位到了/STRUCTURE/GRILLE/ROWS/ROW/CHAMPS/CHAMP节点,而NU_LINE是CHAMP节点向上两层的ROW节点的子元素,默认无法直接读取到该值,所以返回NULL。

解决方案1:修改OPENXML字段映射路径

只需修改OPENXML的WITH子句中NU_LINE的映射规则,通过相对路径向上查找父级ROW节点的NU_LINE值即可:

INSERT @Champs   
    SELECT *   
    FROM OPENXML(@docHandle, N'/STRUCTURE/GRILLE/ROWS/ROW/CHAMPS/CHAMP') 
    WITH (
        NU_LINE VARCHAR(4) '../../NU_LINE', -- 向上两层到ROW节点后读取NU_LINE
        "KEY" VARCHAR(200), 
        LABEL VARCHAR(200), 
        API_NAME VARCHAR(200), 
        API_FIELD VARCHAR(200), 
        "VALUE" VARCHAR(MAX)
    )

注意:使用sp_xml_preparedocument后必须调用sp_xml_removedocument @docHandle释放内存,避免长期运行出现内存泄漏。

解决方案2:使用SQL Server原生XML方法(更推荐)

SQL Server从2005版本开始支持原生XML节点处理方法,性能和稳定性都优于遗留的OPENXML接口,不需要手动管理内存,实现代码如下:

DECLARE @xml XML = CAST(@xmlDocument AS XML)

INSERT @Champs (NU_LINE, [KEY], LABEL, API_NAME, API_FIELD, [VALUE])
SELECT
    R.RowNode.value('(NU_LINE/text())[1]', 'VARCHAR(4)') AS NU_LINE,
    C.ChampNode.value('@KEY', 'VARCHAR(200)') AS [KEY],
    C.ChampNode.value('@LABEL', 'VARCHAR(200)') AS LABEL,
    C.ChampNode.value('@API_NAME', 'VARCHAR(200)') AS API_NAME,
    C.ChampNode.value('@API_FIELD', 'VARCHAR(200)') AS API_FIELD,
    C.ChampNode.value('@VALUE', 'VARCHAR(MAX)') AS [VALUE]
FROM @xml.nodes('/STRUCTURE/GRILLE/ROWS/ROW') AS R(RowNode)
CROSS APPLY R.RowNode.nodes('CHAMPS/CHAMP') AS C(ChampNode)

内容的提问来源于stack exchange,提问作者eric.bryan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 13:27:01