SQL Server 2016解析导入XML数据返回空结果问题咨询
解决方案
你查询返回空结果的核心原因是XML带有wd前缀的自定义命名空间,但原查询语句未声明对应命名空间,导致XPath路径无法匹配到目标节点。
修复后的完整查询代码
-- 声明XML中使用的自定义命名空间,必须和XML头部定义的URI完全一致 WITH XMLNAMESPACES ('urn:com.workday.report/Worker_Details_-_EXPORT_-_Workplace' AS wd) SELECT ReportEntry.value('(wd:Active_Status)[1]', 'VARCHAR(20)') AS ActiveStatus, -- 需要读取其他字段可按下方格式新增 ReportEntry.value('(wd:Legal_Name_-_First_Name)[1]', 'VARCHAR(50)') AS FirstName, ReportEntry.value('(wd:Position)[1]', 'VARCHAR(100)') AS Position FROM (SELECT CAST(XMLCol AS XML) AS XMLContent FROM OPENROWSET(BULK '\\afcn2011\root\DATA\VisualCron\Employee Export\EmployeeExport.xml', SINGLE_BLOB) AS T(XMLCol) ) AS T CROSS APPLY XMLContent.nodes('wd:Report_Data/wd:Report_Entry') AS XMLCol(ReportEntry);
关键修改点说明
- 新增
WITH XMLNAMESPACES声明wd前缀对应的命名空间URI,和XML根节点定义的内容完全一致 - 所有XPath路径中的节点都添加了
wd:前缀,和XML节点的命名空间匹配 - 直接使用
value()方法读取节点值,省略冗余的query()调用,同时加[1]指定读取匹配到的第一个节点值,符合SQL Server XML查询的语法要求 - 调整了别名避免重名冲突,降低报错概率
额外注意事项
- 确保SQL Server服务的运行账号对XML文件所在的网络共享路径有读取权限,否则会触发文件访问类报错
- 如果部分节点在某些
Report_Entry中不存在,查询会返回NULL,属于正常情况 - 日期类字段建议直接转为
DATE或DATETIME类型存储,示例:ReportEntry.value('(wd:Hire_Date)[1]', 'DATETIME') AS HireDate
内容的提问来源于stack exchange,提问作者Femmer
相关产品推荐
相关产品推荐

