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

带命名空间的XML查询问题:OpenXML失效与XQuery动态变量报错

解决方案

1. 修复OpenXML查询(命名空间问题)

OpenXML无法识别带前缀的节点,核心原因是未注册命名空间与前缀的映射关系。需在sp_xml_preparedocument中显式声明关联:

DECLARE @hDoc INT, @xml XML = '<root type="object">...</root>'; -- 替换为你的完整XML内容
DECLARE @path NVARCHAR(200);

-- 注册命名空间:将"item"命名空间绑定到前缀"a"
EXEC sp_xml_preparedocument @hDoc OUTPUT, @xml, '<root xmlns:a="item"/>';

-- 筛选第一个item节点下的ESU_Bl_0数据
Set @path =  N'/root/JSON/schData/ESU/a:item[1]/ESU_Bl_0';
SELECT * from openxml (@hDoc, @path, 2)
with            
(   
     ID         nvarchar(200) 
    ,Item_0_1   nvarchar(200) 
    ,Item_0_2   nvarchar(200) 
);

-- 清理XML文档资源
EXEC sp_xml_removedocument @hDoc;

若需按item属性值筛选(比如取item="1"的节点),修改XPath为:

Set @path =  N'/root/JSON/schData/ESU/a:item[@item="1"]/ESU_Bl_0';

2. 修复动态XQuery查询(变量注入报错)

XQuery的nodes()方法要求参数为字符串字面量,不能直接拼接变量。改用sql:variable()函数在XPath中直接引用T-SQL变量即可解决:

DECLARE @xml XML = '<root type="object">...</root>'; -- 替换为你的完整XML内容
DECLARE @Counter INT = 1; -- 指定要筛选的item属性值

;WITH XMLNAMESPACES('item' AS a)
SELECT 
    c.value('(ID/text())[1]', 'INT') AS ID,
    c.value('(Item_0_1/text())[1]', 'VARCHAR(20)') AS Item_0_1,
    c.value('(Item_0_2/text())[1]', 'VARCHAR(20)') AS Item_0_2
FROM @xml.nodes('/root/JSON/schData/ESU/a:item[@item=sql:variable("@Counter")]/ESU_Bl_0') AS t(c);

核心改动是将拼接变量的写法[@item="'+@Counter+'"]替换为[@item=sql:variable("@Counter")],直接传递变量值而非拼接字符串。


内容的提问来源于stack exchange,提问作者Bilal Siddiqui

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 05:55:16