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

