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
相关产品推荐
相关产品推荐

