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

T-SQL中OPENXML解析含重复嵌套XML命名空间的XML异常问题

解决OPENXML解析带嵌套命名空间XML的问题

你的问题核心是对命名空间作用范围的误解:XML里的<BIGIMResponse>和<DaneZapytaniaFin>节点并没有归属http://bik.pl/cc/big命名空间,只有它们的直接子节点(<forma-pr-podm>、<dane-id-kons>等)才带有这个命名空间。你之前用DEFAULT 'http://bik.pl/cc/big'会强制所有节点都使用这个命名空间,导致根路径匹配失败,所以查询子节点时返回null。

下面给你两种可行的解决方案:

方案一:修正OPENXML的命名空间使用

给目标命名空间起一个别名,在路径中明确区分有命名空间和无命名空间的节点,同时属性也需要带上命名空间前缀:

-- 确保已通过sp_xml_preparedocument初始化@idoc
;WITH XMLNAMESPACES('http://bik.pl/cc/big' AS bk)
SELECT 
    imie, nazw, pesel, seria_nr_dok_tozs
FROM OPENXML(@idoc, '/BIGIMResponse/DaneZapytaniaFin/bk:dane-id-kons')
WITH (
    imie VARCHAR(50) '@bk:imie',
    nazw VARCHAR(50) '@bk:nazw',
    pesel VARCHAR(11) '@bk:pesel',
    seria_nr_dok_tozs VARCHAR(20) '@bk:seria-nr-dok-tozs' -- SQL列名不能含连字符,需替换
)

方案二:推荐使用更现代的XQuery方法

OPENXML是较老旧的XML处理方式,SQL Server支持的XQuery语法更简洁高效,不需要预处理文档:

DECLARE @x XML;
SELECT @x = dane FROM #p_TempDM;

;WITH XMLNAMESPACES('http://bik.pl/cc/big' AS bk)
SELECT
    Kons.node.value('@bk:imie', 'VARCHAR(50)') AS imie,
    Kons.node.value('@bk:nazw', 'VARCHAR(50)') AS nazw,
    Kons.node.value('@bk:pesel', 'VARCHAR(11)') AS pesel,
    Kons.node.value('@bk:seria-nr-dok-tozs', 'VARCHAR(20)') AS seria_nr_dok_tozs
FROM @x.nodes('/BIGIMResponse/DaneZapytaniaFin/bk:dane-id-kons') AS Kons(node)

额外优化:简化XML读取代码

你原来用动态SQL读取XML的方式可以简化,避免动态SQL的潜在风险:

CREATE TABLE #p_TempDM (dane xml);
DECLARE @filePath NVARCHAR(1000) = '你的文件路径'; -- 建议用NVARCHAR避免编码问题

INSERT INTO #p_TempDM
SELECT CONVERT(xml, bulkcolumn, 2) 
FROM OPENROWSET(BULK @filePath, SINGLE_BLOB) AS dane;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:16:03