如何在SQL Server中操作XML?解析XML列数据生成指定格式结果
在SQL Server中解析XML并提取属性的解决方案
没问题,这在SQL Server里完全可以搞定,主要靠XML数据类型自带的.nodes()和.value()方法来拆分节点、提取属性值就行。
假设你的表名为PersonTable,存储XML内容的列名为XmlColumn,下面直接给你可用的查询语句:
SELECT -- 拼接名和姓,用CONCAT自动处理空值 CONCAT(div_node.value('@firstname', 'NVARCHAR(100)'), ' ', div_node.value('@lastname', 'NVARCHAR(100)')) AS FullName, -- 提取缩写属性 div_node.value('@initials', 'NVARCHAR(10)') AS Initials FROM PersonTable CROSS APPLY -- 把XML里的每个<div>节点拆成单独的行 XmlColumn.nodes('//div') AS x(div_node)
关键细节解释:
.nodes('//div'):这个方法会遍历XML中所有的<div>节点,把每个节点转换成一行数据,//是递归查找的意思,不管节点在XML的哪个层级都能找到(如果你的XML有固定根节点,比如<root><div>...</div></root>,也可以写成/root/div来精确匹配)。.value('@firstname', 'NVARCHAR(100)'):从每个<div>节点里提取firstname属性的值,第二个参数是指定返回的数据类型,你可以根据实际数据长度调整(比如改成NVARCHAR(50))。CONCAT():用来拼接名和姓,比直接用+更友好——如果某个属性是空值,CONCAT()不会让整个结果变成NULL,而+会。要是你习惯用+,也可以写成div_node.value('@firstname', 'NVARCHAR(100)') + ' ' + div_node.value('@lastname', 'NVARCHAR(100)'),但记得提前处理空值哦。
测试效果:
如果你的XML列内容是:
<div firstname="Tom" lastname="Hanks" initials="TH" /> <div firstname="Tom" lastname="Hiddleston" initials="TH" />
执行上面的查询后,会得到这样的结果:
| FullName | Initials |
|---|---|
| Tom Hanks | TH |
| Tom Hiddleston | TH |
额外注意:
- 如果你的列不是XML类型(比如是VARCHAR/TEXT),得先转成XML类型再处理,把
XmlColumn.nodes('//div')改成CAST(XmlColumn AS XML).nodes('//div')就行。 - 如果XML里有命名空间,需要用
WITH XMLNAMESPACES来声明,不过你的示例里没有,所以不用管这个。
内容的提问来源于stack exchange,提问作者omega
相关产品推荐
相关产品推荐

