使用SQL Server OPENXML API读取订单XML返回NULL结果求解决方法
解决OPENXML读取XML返回NULL的问题
我太懂你这种用OPENXML读XML结果全是NULL的憋屈了!大概率是WITH子句里的节点路径没和XML结构对应上,或者OPENXML的上下文节点没设置对。我给你整理了一套正确的实现步骤,你可以照着调整:
关键步骤说明
- 必须先调用
sp_xml_preparedocument初始化XML文档句柄,这是OPENXML能正常工作的前提,很多人容易漏掉这一步。 - OPENXML的第三个参数要指定正确的根上下文节点,你的XML根是
<order>,所以要设为'/order',这样后续WITH子句里的路径都是基于这个节点的相对路径。 - WITH子句里的每个列要对应XML元素的正确路径:
- 直接在
<order>下的元素(比如order-date、invoice-no),直接写元素名即可(注意带连字符的元素可以用方括号包裹,或者直接写)。 - 嵌套元素(比如
customer-name在<customer>下),要写相对路径'customer/customer-name'。
- 直接在
完整示例代码
DECLARE @XML AS XML, @hDoc AS INT -- 补全你的XML内容(这里假设完整的customer节点) SELECT @XML = N'<order> <order-date>2017-07-24T20:48:57.000Z</order-date> <invoice-no>00000001</invoice-no> <customer> <customer-name>abc abcd</customer-name> <customer-id>C001</customer-id> </customer> </order>' -- 初始化XML文档句柄 EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML -- 使用OPENXML读取数据,注意WITH子句的路径对应 SELECT * FROM OPENXML(@hDoc, '/order', 2) -- 第三个参数2表示以元素为中心映射 WITH ( [order-date] DATETIME 'order-date', [invoice-no] VARCHAR(20) 'invoice-no', [customer-name] VARCHAR(50) 'customer/customer-name', [customer-id] VARCHAR(10) 'customer/customer-id' ) -- 释放文档句柄(必须执行,避免内存泄漏) EXEC sp_xml_removedocument @hDoc
常见坑提醒
- 注意XML元素名的大小写:XML本身是大小写敏感的,比如XML里是
<order-date>,你就不能在路径里写Order-Date。 - 如果XML有命名空间,需要在
sp_xml_preparedocument里指定命名空间前缀,否则也会返回NULL(你的例子里没有命名空间,暂时不用管)。 - OPENXML的第三个参数(映射模式):设为2是元素中心模式,适合你的XML结构(所有数据都在元素里),如果是属性模式要设为1。
内容的提问来源于stack exchange,提问作者Pinaki Mukherjee
相关产品推荐
相关产品推荐

