SQL Server解析XML报错StoreSurvey列数少于指定列数如何解决
报错原因
nodes() 方法用于将XML中匹配XPath表达式的节点转换为行集,每行对应一个匹配的XML节点,因此它返回的行集仅包含1列(存储匹配到的XML节点本身)。你在为行集指定别名 AS StoreSurvey (AnnualSales, AnnualRevenue) 时定义了2个列名,与实际返回的列数不一致,因此触发该错误。
解决方案
修改行集别名为仅指定1个列名,后续通过.value()方法从该列存储的XML节点中提取所需的子字段值即可,修正后代码如下:
WITH XMLNAMESPACES('http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/StoreSurvey' AS XM) SELECT SalesPersonID, SurveyNode.value('(XM:AnnualSales)[1]', 'INT') AS AnnualSales, SurveyNode.value('(XM:AnnualRevenue)[1]', 'INT') AS AnnualRevenue FROM Sales.Store CROSS APPLY Demographics.nodes('//XM:StoreSurvey') AS StoreSurvey (SurveyNode)
额外注意项
.value()方法中XPath末尾加[1]是为了明确指定取匹配到的第一个节点值,避免XML结构存在多个同名字段时的语法报错- 若业务场景中单个
节点下存在多个AnnualSales/AnnualRevenue节点,可根据实际需求调整XPath的索引取值逻辑
内容的提问来源于stack exchange,提问作者sasaii
相关产品推荐
相关产品推荐

