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

SQL Server导入XML文件时所有值均为0的问题排查求助

SQL Server导入XML文件时所有值均为0的问题排查求助

嘿,我一眼就瞅出问题所在啦!你的XML里ID、PARENTID这些字段都是ITEM元素的属性,不是嵌套的子元素,但你的查询代码一直在找子节点,根本取不到对应的值,转成bigint类型时自然就默认变成0了。

先看看你的XML结构:

<?xml version="1.0" encoding="utf-8"?>
<ITEMS>
  <ITEM ID="1713" PARENTID="233283" CHILDID="233310" CHANGEID="601851" />
  <ITEM ID="1714" PARENTID="233363" CHILDID="233369" CHANGEID="602057" />
</ITEMS>

这里的ID、PARENTID都是ITEM标签的属性(就是写在标签尖括号里的键值对),而不是像<PARENTID>233283</PARENTID>这样的子元素。你之前的查询用query('PARENTID')是在找ITEM下面的PARENTID子元素,这显然不存在,返回空值后转成bigint就变成0了。

给你改好的查询代码:

SELECT 
    MY_XML.ITEM.value('@ID', 'bigint'),
    MY_XML.ITEM.value('@PARENTID', 'bigint'),
    MY_XML.ITEM.value('@CHILDID', 'bigint'),
    MY_XML.ITEM.value('@CHANGEID', 'bigint')
FROM (
    SELECT CAST(MY_XML AS xml) 
    FROM OPENROWSET(BULK 'E:\Proger\GAR\xml\19\ADDR_OBJ.XML', SINGLE_BLOB) AS T(MY_XML)
) AS T(MY_XML)
CROSS APPLY MY_XML.nodes('ITEMS/ITEM') AS MY_XML (ITEM);

几个关键的修改点:

  • 用@符号来引用属性,比如@PARENTID就是指ITEM元素的PARENTID属性
  • 直接用value()方法获取属性值,不需要先调用query(),这样更高效也更准确
  • 你原查询里第一个字段MY_XML.ITEM.query('.').value('.', 'bigint')是取整个ITEM元素的文本内容,但ITEM是自闭合标签,没有文本,所以转成bigint也是0,改成@ID就能正确拿到ID的值了

小提示:以后遇到类似问题,可以先执行SELECT MY_XML查看完整的XML内容,确认目标值是属性还是子元素,避免找错节点类型哦!

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 09:53:00